/ Hex Artifact Content
Login

Artifact 6614381d96520d7c73d0fb2eb5291533a6b04d16:


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 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1310: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1320: 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tem is initializ
1330: 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74  ed.  If unable t
1340: 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  o .  ** initiali
1350: 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  ze the mutex sub
1360: 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65  system, return e
1370: 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72  arly with the er
1380: 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ror..  ** If the
1390: 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69   system is so si
13a0: 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75  ck that we are u
13b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
13c0: 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20  e a mutex,.  ** 
13d0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  there is not muc
13e0: 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e  h SQLite is goin
13f0: 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  g to be able to 
1400: 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  do..  **.  ** Th
1410: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
1420: 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65  m must take care
1430: 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20   of serializing 
1440: 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69  its own.  ** ini
1450: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a  tialization..  *
1460: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1470: 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69  MutexInit();.  i
1480: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1490: 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  c;..  /* Initial
14a0: 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29  ize the malloc()
14b0: 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20   system and the 
14c0: 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d  recursive pInitM
14d0: 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a  utex mutex..  **
14e0: 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
14f0: 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1500: 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45  the STATIC_MASTE
1510: 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74  R mutex.  Note t
1520: 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c  hat.  ** MutexAl
1530: 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20  loc() is called 
1540: 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74  for a static mut
1550: 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74  ex prior to init
1560: 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a  ializing the.  *
1570: 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  * malloc subsyst
1580: 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65  em - this implie
1590: 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  s that the alloc
15a0: 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69  ation of a stati
15b0: 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73  c.  ** mutex mus
15c0: 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75  t not require su
15d0: 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d  pport from the m
15e0: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e  alloc subsystem.
15f0: 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  .  */.  MUTEX_LO
1600: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
1610: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1620: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1630: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
1640: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1650: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
1660: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1670: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
1680: 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71  t = 1;.  if( !sq
1690: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29  g.isMallocInit )
16b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16c0: 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a  e3MallocInit();.
16d0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1700: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1710: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71  = 1;.    if( !sq
1720: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1730: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1750: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1760: 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20  utex =.         
1770: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c    sqlite3MutexAl
1780: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1790: 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
17a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
17b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
17c0: 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65  Mutex && !sqlite
17d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
17e0: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
17f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1800: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1810: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1830: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1840: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1850: 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73  Mutex++;.  }.  s
1860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1870: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
1880: 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20  /* If rc is not 
1890: 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69  SQLITE_OK at thi
18a0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69  s point, then ei
18b0: 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a  ther the malloc.
18c0: 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63    ** subsystem c
18d0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74  ould not be init
18e0: 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73  ialized or the s
18f0: 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20  ystem failed to 
1900: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68  allocate.  ** th
1910: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1920: 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  ex. Return an er
1930: 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61  ror in either ca
1940: 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  se.  */.  if( rc
1950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1960: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1970: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72  }..  /* Do the r
1980: 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69  est of the initi
1990: 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20  alization under 
19a0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75  the recursive mu
19b0: 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  tex so.  ** that
19c0: 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65   we will be able
19d0: 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72   to handle recur
19e0: 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a  sive calls into.
19f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1a00: 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20  tialize().  The 
1a10: 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1a20: 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68  normally come th
1a30: 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74  rough.  ** sqlit
1a40: 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65  e3_os_init() whe
1a50: 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c  n it invokes sql
1a60: 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1a70: 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20  r(), but other. 
1a80: 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61   ** recursive ca
1a90: 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  lls might also b
1aa0: 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a  e possible..  **
1ab0: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
1ac0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30  TION-OF: R-00140
1ad0: 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75  -37445 SQLite au
1ae0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69  tomatically seri
1af0: 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a  alizes calls.  *
1b00: 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d  * to the xInit m
1b10: 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49  ethod, so the xI
1b20: 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20  nit method need 
1b30: 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66  not be threadsaf
1b40: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
1b50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78   following mutex
1b60: 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69   is what seriali
1b70: 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68  zes access to th
1b80: 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20  e appdef pcache 
1b90: 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f  xInit.  ** metho
1ba0: 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ds.  The sqlite3
1bb0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e  _pcache_methods.
1bc0: 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65  xInit() all is e
1bd0: 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20  mbedded in the. 
1be0: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
1bf0: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1c00: 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  ize()..  */.  sq
1c10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c20: 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  r(sqlite3GlobalC
1c30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1c40: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1c50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1c60: 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  nit==0 && sqlite
1c70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1c80: 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20  Progress==0 ){. 
1c90: 20 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a     FuncDefHash *
1ca0: 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28  pHash = &GLOBAL(
1cb0: 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c  FuncDefHash, sql
1cc0: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
1cd0: 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ons);.    sqlite
1ce0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1cf0: 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  Progress = 1;.  
1d00: 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20    memset(pHash, 
1d10: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
1d20: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1d30: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  ));.    sqlite3R
1d40: 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e  egisterGlobalFun
1d50: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66  ctions();.    if
1d60: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1d70: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
1d80: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
1da0: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  eInitialize();. 
1db0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1dc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      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 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
1e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e  rc = sqlite3OsIn
1e10: 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  it();.    }.    
1e20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e30: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e40: 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65  e3PCacheBufferSe
1e50: 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  tup( sqlite3Glob
1e60: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20  alConfig.pPage, 
1e70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
1e90: 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c  zPage, sqlite3Gl
1ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
1eb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1ed0: 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  nit = 1;.#ifdef 
1ee0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
1ef0: 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74 72  T.      bRunExtr
1f00: 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69  aInit = 1;.#endi
1f10: 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  f.    }.    sqli
1f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f30: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  inProgress = 0;.
1f40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1f50: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1f70: 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  nitMutex);..  /*
1f80: 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74   Go back under t
1f90: 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  he static mutex 
1fa0: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
1fb0: 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20   recursive.  ** 
1fc0: 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74  mutex to prevent
1fd0: 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b   a resource leak
1fe0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1ff0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
2000: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
2010: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2020: 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20  fInitMutex--;.  
2030: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2040: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
2050: 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20  Mutex<=0 ){.    
2060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
2070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
2080: 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  InitMutex==0 );.
2090: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20a0: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c  x_free(sqlite3Gl
20b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
20c0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Mutex);.    sqli
20d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
20e0: 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a  pInitMutex = 0;.
20f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2100: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
2110: 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  r);..  /* The fo
2120: 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20  llowing is just 
2130: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74  a sanity check t
2140: 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  o make sure SQLi
2150: 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  te has.  ** been
2160: 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63   compiled correc
2170: 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f  tly.  It is impo
2180: 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69  rtant to run thi
2190: 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a  s code, but.  **
21a0: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
21b0: 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74  o run it too oft
21c0: 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43  en and soak up C
21d0: 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f  PU cycles for no
21e0: 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53  .  ** reason.  S
21f0: 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65  o we run it once
2200: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2210: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  zation..  */.#if
2220: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e  ndef NDEBUG.#ifn
2230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2240: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
2250: 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   /* This section
2260: 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20   of code's only 
2270: 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20  "output" is via 
2280: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2290: 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72  nts. */.  if ( r
22a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22b0: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75      u64 x = (((u
22c0: 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20  64)1)<<63)-1;.  
22d0: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
22e0: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
22f0: 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ==8);.    assert
2300: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65  (sizeof(x)==size
2310: 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63  of(y));.    memc
2320: 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20  py(&y, &x, 8);. 
2330: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2340: 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20  e3IsNaN(y) );.  
2350: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
2360: 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69  .  /* Do extra i
2370: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74  nitialization st
2380: 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79  eps requested by
2390: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52   the SQLITE_EXTR
23a0: 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70  A_INIT.  ** comp
23b0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
23c0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
23d0: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
23e0: 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49 6e   if( bRunExtraIn
23f0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51  it ){.    int SQ
2400: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2410: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
2420: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 58    rc = SQLITE_EX
2430: 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d  TRA_INIT(0);.  }
2440: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2450: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
2460: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
2470: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
2480: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
2490: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
24a0: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
24b0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
24c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
24d0: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
24e0: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
24f0: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2500: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2510: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2520: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
2530: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
2540: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
2550: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
2560: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
2570: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
2580: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
2590: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
25a0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
25b0: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
25c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25d0: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
25e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
25f0: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2600: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2610: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2620: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2630: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2640: 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  nit ){.#ifdef SQ
2650: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2660: 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c  OWN.    void SQL
2670: 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f  ITE_EXTRA_SHUTDO
2680: 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51  WN(void);.    SQ
2690: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
26a0: 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OWN();.#endif.  
26b0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
26c0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
26d0: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
26e0: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
26f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2700: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2720: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2730: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
2740: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
2750: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
2760: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2770: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
2780: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2790: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27a0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
27b0: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
27c0: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
27d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27e0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
27f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2800: 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44  _OMIT_SHUTDOWN_D
2810: 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20 2f  IRECTORIES.    /
2820: 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73 79  * The heap subsy
2830: 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65 65  stem has now bee
2840: 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20 74  n shutdown and t
2850: 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65 20  hese values are 
2860: 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20  supposed.    ** 
2870: 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f  to be NULL or po
2880: 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68  int to memory th
2890: 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  at was obtained 
28a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
28b0: 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68  loc(),.    ** wh
28c0: 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f  ich would rely o
28d0: 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62 73  n that heap subs
28e0: 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72 65  ystem; therefore
28f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 73  , make sure thes
2900: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
2910: 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  cannot refer to 
2920: 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61 74  heap memory that
2930: 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c 69   was just invali
2940: 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a 20  dated when the. 
2950: 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73 79     ** heap subsy
2960: 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f 77  stem was shutdow
2970: 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  n.  This is only
2980: 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72   done if the cur
2990: 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  rent call to.   
29a0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
29b0: 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74 68  n resulted in th
29c0: 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  e heap subsystem
29d0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
29e0: 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f  shutdown..    */
29f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74  .    sqlite3_dat
2a00: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
2a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d  .    sqlite3_tem
2a20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
2a30: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2a40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2a50: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2a60: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2a70: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20  MutexEnd();.    
2a80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2a90: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
2aa0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
2ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ac0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20  ./*.** This API 
2ad0: 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69  allows applicati
2ae0: 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ons to modify th
2af0: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
2b00: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  ration of.** the
2b10: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2b20: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a  at run-time..**.
2b30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b40: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2b50: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
2b60: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
2b70: 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
2b80: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2b90: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2ba0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2bb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61   is not.** threa
2bc0: 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20  dsafe.  Failure 
2bd0: 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77 61  to heed these wa
2be0: 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20  rnings can lead 
2bf0: 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65  to unpredictable
2c00: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  .** behavior..*/
2c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .int sqlite3_con
2c20: 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  fig(int op, ...)
2c30: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2c40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c50: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  E_OK;..  /* sqli
2c60: 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61  te3_config() sha
2c70: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
2c80: 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69 73  _MISUSE if it is
2c90: 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20   invoked while. 
2ca0: 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c   ** the SQLite l
2cb0: 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73 65  ibrary is in use
2cc0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
2cd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2ce0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
2cf0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
2d00: 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  T;..  va_start(a
2d10: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
2d20: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  ( op ){..    /* 
2d30: 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74  Mutex configurat
2d40: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ion options are 
2d50: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
2d60: 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a 20  n a threadsafe. 
2d70: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a 20     ** compile.. 
2d80: 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65     */.#if define
2d90: 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  d(SQLITE_THREADS
2da0: 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  AFE) && SQLITE_T
2db0: 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f 2a 20  HREADSAFE>0  /* 
2dc0: 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34 36 37  IMP: R-54466-467
2dd0: 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  56 */.    case S
2de0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
2df0: 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  GLETHREAD: {.   
2e00: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c     /* Disable al
2e10: 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20  l mutexing */.  
2e20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2e30: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
2e40: 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ex = 0;.      sq
2e50: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2e60: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
2e70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2e80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
2e90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2ea0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
2eb0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
2ec0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32  0 /* IMP: R-2052
2ed0: 30 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63  0-54086 */.    c
2ee0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2ef0: 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b  G_MULTITHREAD: {
2f00: 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c  .      /* Disabl
2f10: 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64 61  e mutexing of da
2f20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2f30: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  ns */.      /* E
2f40: 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f  nable mutexing o
2f50: 66 20 63 6f 72 65 20 64 61 74 61 20 73 74 72 75  f core data stru
2f60: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20 20  ctures */.      
2f70: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2f80: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
2f90: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
2fa0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
2fb0: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20  ullMutex = 0;.  
2fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2fd0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
2fe0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
2ff0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3000: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3010: 20 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d 32 31   IMP: R-59593-21
3020: 38 31 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  810 */.    case 
3030: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45  SQLITE_CONFIG_SE
3040: 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20  RIALIZED: {.    
3050: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20    /* Enable all 
3060: 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20  mutexing */.    
3070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3080: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3090: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
30a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
30b0: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a  bFullMutex = 1;.
30c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30d0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
30e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
30f0: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
3100: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
3110: 2f 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d  /* IMP: R-63666-
3120: 34 38 37 35 35 20 2a 2f 0a 20 20 20 20 63 61 73  48755 */.    cas
3130: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3140: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
3150: 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74  * Specify an alt
3160: 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20 69  ernative mutex i
3170: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
3180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3190: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
31a0: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
31b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
31c0: 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72  hods*);.      br
31d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
31e0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
31f0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29  LITE_THREADSAFE)
3200: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
3210: 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20  DSAFE>0 /* IMP: 
3220: 52 2d 31 34 34 35 30 2d 33 37 35 39 37 20 2a 2f  R-14450-37597 */
3230: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3240: 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58  _CONFIG_GETMUTEX
3250: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74  : {.      /* Ret
3260: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
3270: 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  t mutex implemen
3280: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3290: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
32a0: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
32b0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
32c0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b  balConfig.mutex;
32d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
32f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3300: 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  IG_MALLOC: {.   
3310: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3320: 46 3a 20 52 2d 35 35 35 39 34 2d 32 31 30 33 30  F: R-55594-21030
3330: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
3340: 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e  IG_MALLOC option
3350: 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a   takes a.      *
3360: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3370: 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69  t which is a poi
3380: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
3390: 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  nce of the.     
33a0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f   ** sqlite3_mem_
33b0: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
33c0: 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
33d0: 73 70 65 63 69 66 69 65 73 20 61 6c 74 65 72 6e  specifies altern
33e0: 61 74 69 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c  ative.      ** l
33f0: 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20  ow-level memory 
3400: 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69  allocation routi
3410: 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 69  nes to be used i
3420: 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6d  n place of the m
3430: 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a 20 61  emory.      ** a
3440: 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  llocation routin
3450: 65 73 20 62 75 69 6c 74 20 69 6e 74 6f 20 53 51  es built into SQ
3460: 4c 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73  Lite. */.      s
3470: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3480: 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61  ig.m = *va_arg(a
3490: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  p, sqlite3_mem_m
34a0: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
34b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
34c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
34d0: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b  FIG_GETMALLOC: {
34e0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
34f0: 43 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34  CE-OF: R-51213-4
3500: 36 34 31 34 20 54 68 65 20 53 51 4c 49 54 45 5f  6414 The SQLITE_
3510: 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43  CONFIG_GETMALLOC
3520: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a   option takes a.
3530: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3540: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
3550: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
3560: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3570: 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
3580: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3590: 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 73 71  tructure. The sq
35a0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
35b0: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 20  s structure is. 
35c0: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
35d0: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 6c  ith the currentl
35e0: 79 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  y defined memory
35f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74   allocation rout
3600: 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ines. */.      i
3610: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3620: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
3630: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d  ==0 ) sqlite3Mem
3640: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
3650: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
3660: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3670: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3680: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lobalConfig.m;. 
3690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
36a0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
36b0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
36c0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  US: {.      /* E
36d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31  VIDENCE-OF: R-61
36e0: 32 37 35 2d 33 35 31 35 37 20 54 68 65 20 53 51  275-35157 The SQ
36f0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53  LITE_CONFIG_MEMS
3700: 54 41 54 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b  TATUS option tak
3710: 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67  es.      ** sing
3720: 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74  le argument of t
3730: 79 70 65 20 69 6e 74 2c 20 69 6e 74 65 72 70 72  ype int, interpr
3740: 65 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65 61  eted as a boolea
3750: 6e 2c 20 77 68 69 63 68 20 65 6e 61 62 6c 65 73  n, which enables
3760: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 64 69 73  .      ** or dis
3770: 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c 65 63  ables the collec
3780: 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61  tion of memory a
3790: 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74 69 73  llocation statis
37a0: 74 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tics. */.      s
37b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
37c0: 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76 61  ig.bMemstat = va
37d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
37e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3800: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
3810: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
3820: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 34 30  DENCE-OF: R-0840
3830: 34 2d 36 30 38 38 37 20 54 68 65 72 65 20 61 72  4-60887 There ar
3840: 65 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74  e three argument
3850: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51  s to.      ** SQ
3860: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41  LITE_CONFIG_SCRA
3870: 54 43 48 3a 20 41 20 70 6f 69 6e 74 65 72 20 61  TCH: A pointer a
3880: 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  n 8-byte aligned
3890: 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 20 66   memory buffer f
38a0: 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  rom.      ** whi
38b0: 63 68 20 74 68 65 20 73 63 72 61 74 63 68 20 61  ch the scratch a
38c0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20  llocations will 
38d0: 62 65 20 64 72 61 77 6e 2c 20 74 68 65 20 73 69  be drawn, the si
38e0: 7a 65 20 6f 66 20 65 61 63 68 20 73 63 72 61 74  ze of each scrat
38f0: 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ch.      ** allo
3900: 63 61 74 69 6f 6e 20 28 73 7a 29 2c 20 61 6e 64  cation (sz), and
3910: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
3920: 62 65 72 20 6f 66 20 73 63 72 61 74 63 68 20 61  ber of scratch a
3930: 6c 6c 6f 63 61 74 69 6f 6e 73 20 28 4e 29 2e 20  llocations (N). 
3940: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3950: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63  GlobalConfig.pSc
3960: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3970: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
3980: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3990: 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d  nfig.szScratch =
39a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
39b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
39c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72  lobalConfig.nScr
39d0: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
39e0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
39f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3a00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3a10: 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20  G_PAGECACHE: {. 
3a20: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3a30: 2d 4f 46 3a 20 52 2d 33 31 34 30 38 2d 34 30 35  -OF: R-31408-405
3a40: 31 30 20 54 68 65 72 65 20 61 72 65 20 74 68 72  10 There are thr
3a50: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
3a60: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
3a70: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
3a80: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 38  : A pointer to 8
3a90: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3aa0: 6d 6f 72 79 2c 20 74 68 65 20 73 69 7a 65 0a 20  mory, the size. 
3ab0: 20 20 20 20 20 2a 2a 20 6f 66 20 65 61 63 68 20       ** of each 
3ac0: 70 61 67 65 20 62 75 66 66 65 72 20 28 73 7a 29  page buffer (sz)
3ad0: 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  , and the number
3ae0: 20 6f 66 20 70 61 67 65 73 20 28 4e 29 2e 20 2a   of pages (N). *
3af0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3b00: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
3b10: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
3b20: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3b30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b40: 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67  .szPage = va_arg
3b50: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3b60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3b70: 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f  nfig.nPage = va_
3b80: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3b90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3ba0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3bb0: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48  _CONFIG_PCACHE_H
3bc0: 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  DRSZ: {.      /*
3bd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3be0: 33 39 31 30 30 2d 32 37 33 31 37 20 54 68 65 20  39100-27317 The 
3bf0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
3c00: 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74 69 6f  ACHE_HDRSZ optio
3c10: 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a  n takes.      **
3c20: 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61 6d 65   a single parame
3c30: 74 65 72 20 77 68 69 63 68 20 69 73 20 61 20 70  ter which is a p
3c40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
3c50: 65 67 65 72 20 61 6e 64 20 77 72 69 74 65 73 20  eger and writes 
3c60: 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  into.      ** th
3c70: 61 74 20 69 6e 74 65 67 65 72 20 74 68 65 20 6e  at integer the n
3c80: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 62  umber of extra b
3c90: 79 74 65 73 20 70 65 72 20 70 61 67 65 20 72 65  ytes per page re
3ca0: 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
3cb0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  page.      ** in
3cc0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3cd0: 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20 20 20  AGECACHE. */.   
3ce0: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 69     *va_arg(ap, i
3cf0: 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20 20 20  nt*) = .        
3d00: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
3d10: 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20 20 20  izeBtree() +.   
3d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65         sqlite3He
3d30: 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 28 29  aderSizePcache()
3d40: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   +.          sql
3d50: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50 63  ite3HeaderSizePc
3d60: 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20 20 62  ache1();.      b
3d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3d80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3d90: 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20  FIG_PCACHE: {.  
3da0: 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
3db0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3dc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3dd0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
3de0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
3df0: 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  now an error */.
3e00: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3e10: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3e30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3e40: 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20  FIG_PCACHE2: {. 
3e50: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3e60: 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34 38 33  -OF: R-63325-483
3e70: 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  78 The SQLITE_CO
3e80: 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f 70 74  NFIG_PCACHE2 opt
3e90: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
3ea0: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
3eb0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
3ec0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
3ed0: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3ee0: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
3ef0: 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62 6a 65  bject. This obje
3f00: 63 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65  ct specifies the
3f10: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 20   interface to a 
3f20: 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61 63 68  custom page cach
3f30: 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  e.      ** imple
3f40: 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  mentation. */.  
3f50: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3f60: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20  lConfig.pcache2 
3f70: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
3f80: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3f90: 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62  hods2*);.      b
3fa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3fb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3fc0: 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b  IG_GETPCACHE2: {
3fd0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3fe0: 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35 2d 34  CE-OF: R-22035-4
3ff0: 36 31 38 32 20 54 68 65 20 53 51 4c 49 54 45 5f  6182 The SQLITE_
4000: 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45  CONFIG_GETPCACHE
4010: 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  2 option takes a
4020: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
4030: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
4040: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4050: 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  an sqlite3_pcach
4060: 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20 20  e_methods2.     
4070: 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51 4c 69   ** object. SQLi
4080: 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  te copies of the
4090: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 61   current page ca
40a0: 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  che implementati
40b0: 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a  on into.      **
40c0: 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20 2a 2f   that object. */
40d0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
40e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
40f0: 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20  cache2.xInit==0 
4100: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4110: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
4120: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
4130: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
4140: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
4150: 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69  ethods2*) = sqli
4160: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4170: 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62  pcache2;.      b
4180: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f 2a 20  reak;.    }../* 
4190: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
41a0: 36 36 32 36 2d 31 32 39 31 31 20 54 68 65 20 53  6626-12911 The S
41b0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41  QLITE_CONFIG_HEA
41c0: 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  P option is only
41d0: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 66  .** available if
41e0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
41f0: 6c 65 64 20 77 69 74 68 20 65 69 74 68 65 72 20  led with either 
4200: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4210: 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51 4c 49  MSYS3 or.** SQLI
4220: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
4230: 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  5 and returns SQ
4240: 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 69 6e  LITE_ERROR if in
4250: 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73 65 2e  voked otherwise.
4260: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
4270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4280: 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65  MSYS3) || define
4290: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
42a0: 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73  MEMSYS5).    cas
42b0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
42c0: 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  HEAP: {.      /*
42d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
42e0: 31 39 38 35 34 2d 34 32 31 32 36 20 54 68 65 72  19854-42126 Ther
42f0: 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67 75  e are three argu
4300: 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  ments to.      *
4310: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  * SQLITE_CONFIG_
4320: 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74 65 20  HEAP: An 8-byte 
4330: 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65 72 20  aligned pointer 
4340: 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74  to the memory, t
4350: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  he.      ** numb
4360: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
4370: 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  he memory buffer
4380: 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75  , and the minimu
4390: 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  m allocation siz
43a0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
43b0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
43c0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
43d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
43e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
43f0: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
4400: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4410: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4420: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4430: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4440: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
4450: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4460: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
4470: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4480: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
4490: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
44a0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
44b0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
44c0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
44d0: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
44e0: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
44f0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
4500: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
4510: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
4520: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
4530: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
4540: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
4550: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
4560: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32  DENCE-OF: R-4992
4570: 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20 66  0-60189 If the f
4580: 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74 68  irst pointer (th
4590: 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72  e memory pointer
45a0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  ).        ** is 
45b0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74  NULL, then SQLit
45c0: 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73 69  e reverts to usi
45d0: 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20 6d  ng its default m
45e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a  emory allocator.
45f0: 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20          ** (the 
4600: 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20  system malloc() 
4610: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c  implementation),
4620: 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72 69   undoing any pri
4630: 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  or invocation of
4640: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  .        ** SQLI
4650: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
4660: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
4670: 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67 20       ** Setting 
4680: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4690: 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72  fig.m to all zer
46a0: 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d 61  os will cause ma
46b0: 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20 20  lloc to.        
46c0: 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74 73  ** revert to its
46d0: 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65   default impleme
46e0: 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c  ntation when sql
46f0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
4700: 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20 20  ) is run.       
4710: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   */.        mems
4720: 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61  et(&sqlite3Globa
4730: 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69  lConfig.m, 0, si
4740: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
4750: 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20  alConfig.m));.  
4760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4770: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
4780: 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31 38  F: R-61006-08918
4790: 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 70   If the memory p
47a0: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ointer is not NU
47b0: 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  LL then the.    
47c0: 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69      ** alternati
47d0: 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ve memory alloca
47e0: 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20 74  tor is engaged t
47f0: 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20  o handle all of 
4800: 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20 20  SQLites.        
4810: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
4820: 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23  tion needs. */.#
4830: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4840: 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20  BLE_MEMSYS3.    
4850: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4860: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c  lConfig.m = *sql
4870: 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73  ite3MemGetMemsys
4880: 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  3();.#endif.#ifd
4890: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
48a0: 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20  _MEMSYS5.       
48b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
48c0: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
48d0: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29  3MemGetMemsys5()
48e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
48f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4900: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
4910: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
4920: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
4930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4940: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
4950: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
4960: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
4970: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4980: 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  ig.nLookaside = 
4990: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
49a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49b0: 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20    }.    .    /* 
49c0: 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  Record a pointer
49d0: 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66   to the logger f
49e0: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20  unction and its 
49f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
4a00: 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75      ** The defau
4a10: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67  lt is NULL.  Log
4a20: 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  ging is disabled
4a30: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
4a40: 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20   pointer is.    
4a50: 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  ** NULL..    */.
4a60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4a70: 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20  CONFIG_LOG: {.  
4a80: 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
4a90: 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
4aa0: 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
4ab0: 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
4ac0: 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
4ad0: 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
4ae0: 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
4af0: 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
4b00: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
4b10: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a  a_arg(ap, void(*
4b20: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
4b30: 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
4b40: 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
4b50: 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f  f void(*LOGFUNC_
4b60: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  t)(void*,int,con
4b70: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
4b80: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b90: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
4ba0: 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74  rg(ap, LOGFUNC_t
4bb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4bc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f  GlobalConfig.pLo
4bd0: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
4be0: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
4bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4c00: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4c10: 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37 20  : R-55548-33817 
4c20: 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  The compile-time
4c30: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52 49   setting for URI
4c40: 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a   filenames.    *
4c50: 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
4c60: 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 75   at start-time u
4c70: 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  sing the.    ** 
4c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
4c90: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
4ca0: 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  ,1) or.    ** sq
4cb0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
4cc0: 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30  ITE_CONFIG_URI,0
4cd0: 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ) configuration 
4ce0: 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  calls..    */.  
4cf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4d00: 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20  NFIG_URI: {.    
4d10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4d20: 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35 20  : R-25451-61125 
4d30: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
4d40: 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b  G_URI option tak
4d50: 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20  es a single.    
4d60: 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66    ** argument of
4d70: 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f   type int. If no
4d80: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52 49  n-zero, then URI
4d90: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f   handling is glo
4da0: 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65  bally.      ** e
4db0: 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20 70  nabled. If the p
4dc0: 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f  arameter is zero
4dd0: 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c  , then URI handl
4de0: 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a  ing is globally.
4df0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
4e00: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  d. */.      sqli
4e10: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4e20: 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72  bOpenUri = va_ar
4e30: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
4e40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4e50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4e60: 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f  CONFIG_COVERING_
4e70: 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20  INDEX_SCAN: {.  
4e80: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4e90: 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37 37  OF: R-36592-0277
4ea0: 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  2 The SQLITE_CON
4eb0: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
4ec0: 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a  EX_SCAN.      **
4ed0: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20   option takes a 
4ee0: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61  single integer a
4ef0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
4f00: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
4f10: 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65  a.      ** boole
4f20: 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  an in order to e
4f30: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
4f40: 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76 65   the use of cove
4f50: 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f 72  ring indices for
4f60: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74  .      ** full t
4f70: 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74 68  able scans in th
4f80: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
4f90: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
4fa0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4fb0: 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72 67  bUseCis = va_arg
4fc0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
4fe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4ff0: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63  BLE_SQLLOG.    c
5000: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5010: 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20  G_SQLLOG: {.    
5020: 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a    typedef void(*
5030: 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  SQLLOGFUNC_t)(vo
5040: 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  id*, sqlite3*, c
5050: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
5060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
5080: 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  log = va_arg(ap,
5090: 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a   SQLLOGFUNC_t);.
50a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50b0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
50c0: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
50d0: 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20  , void *);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
50f0: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
5100: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5110: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
5120: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
5130: 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53 51  R-58063-38258 SQ
5140: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
5150: 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f 20  _SIZE takes two 
5160: 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  64-bit.      ** 
5170: 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65 33  integer (sqlite3
5180: 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20 74  _int64) values t
5190: 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66 61  hat are the defa
51a0: 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69  ult mmap size li
51b0: 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  mit.      ** (th
51c0: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
51d0: 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61  g for PRAGMA mma
51e0: 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65 20  p_size) and the 
51f0: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a  maximum allowed.
5200: 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69        ** mmap si
5210: 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20  ze limit. */.   
5220: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
5230: 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67   szMmap = va_arg
5240: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  (ap, sqlite3_int
5250: 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  64);.      sqlit
5260: 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20  e3_int64 mxMmap 
5270: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
5280: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20  ite3_int64);.   
5290: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
52a0: 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39 30  F: R-53367-43190
52b0: 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75 6d   If either argum
52c0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74 69  ent to this opti
52d0: 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e  on is.      ** n
52e0: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
52f0: 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 63  at argument is c
5300: 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63 6f  hanged to its co
5310: 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61 75  mpile-time defau
5320: 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  lt..      **.   
5330: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
5340: 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33 31  F: R-34993-45031
5350: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
5360: 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20 77  owed mmap size w
5370: 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
5380: 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61 74  silently truncat
5390: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ed if necessary 
53a0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
53b0: 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a 20  not exceed the. 
53c0: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d       ** compile-
53d0: 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  time maximum mma
53e0: 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74 68  p size set by th
53f0: 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  e SQLITE_MAX_MMA
5400: 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20  P_SIZE.      ** 
5410: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
5420: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
5430: 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30      if( mxMmap<0
5440: 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54   || mxMmap>SQLIT
5450: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20  E_MAX_MMAP_SIZE 
5460: 29 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54  ) mxMmap = SQLIT
5470: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b  E_MAX_MMAP_SIZE;
5480: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61  .      if( szMma
5490: 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53  p<0 ) szMmap = S
54a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d  QLITE_DEFAULT_MM
54b0: 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69  AP_SIZE;.      i
54c0: 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70  f( szMmap>mxMmap
54d0: 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  ) szMmap = mxMma
54e0: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
54f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
5500: 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20  map = mxMmap;.  
5510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5520: 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d  lConfig.szMmap =
5530: 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62   szMmap;.      b
5540: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
5550: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26   SQLITE_OS_WIN &
5560: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5570: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f  _WIN32_MALLOC) /
5580: 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35  * IMP: R-04780-5
5590: 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65  5815 */.    case
55a0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57   SQLITE_CONFIG_W
55b0: 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b  IN32_HEAPSIZE: {
55c0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
55d0: 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30  CE-OF: R-34926-0
55e0: 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46  3360 SQLITE_CONF
55f0: 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a  IG_WIN32_HEAPSIZ
5600: 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74  E takes a 32-bit
5610: 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e  .      ** unsign
5620: 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ed integer value
5630: 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
5640: 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
5650: 20 6f 66 20 74 68 65 20 63 72 65 61 74 65 64 0a   of the created.
5660: 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a        ** heap. *
5670: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
5680: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
5690: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
56a0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
56b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
56c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
56d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
56e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
56f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5700: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5710: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5720: 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  ** Set up the lo
5730: 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20  okaside buffers 
5740: 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
5750: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65  onnection..** Re
5760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
5770: 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20  n success.  .** 
5780: 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20  If lookaside is 
5790: 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20  already active, 
57a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
57b0: 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a  SY..**.** The sz
57c0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
57d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
57e0: 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73  s in each lookas
57f0: 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65  ide slot..** The
5800: 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69   cnt parameter i
5810: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
5820: 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72  slots.  If pStar
5830: 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a  t is NULL the.**
5840: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c   space for the l
5850: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
5860: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
5870: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
5880: 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20  )..** If pStart 
5890: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
58a0: 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79   it is sz*cnt by
58b0: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  tes of memory to
58c0: 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20   use for.** the 
58d0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
58e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
58f0: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73  setupLookaside(s
5900: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
5910: 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20   *pBuf, int sz, 
5920: 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64  int cnt){.  void
5930: 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20   *pStart;.  if( 
5940: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
5950: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
5960: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
5970: 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  }.  /* Free any 
5980: 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69  existing lookasi
5990: 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68  de buffer for th
59a0: 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65  is handle before
59b0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67  .  ** allocating
59c0: 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65   a new one so we
59d0: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68   don't have to h
59e0: 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20  ave space for . 
59f0: 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20   ** both at the 
5a00: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  same time..  */.
5a10: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
5a20: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b  ide.bMalloced ){
5a30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5a40: 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  e(db->lookaside.
5a50: 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f  pStart);.  }.  /
5a60: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  * The size of a 
5a70: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61  lookaside slot a
5a80: 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20  fter ROUNDDOWN8 
5a90: 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67  needs to be larg
5aa0: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70  er.  ** than a p
5ab0: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65  ointer to be use
5ac0: 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d  ful..  */.  sz =
5ad0: 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b   ROUNDDOWN8(sz);
5ae0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33    /* IMP: R-3303
5af0: 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28  8-09382 */.  if(
5b00: 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66   sz<=(int)sizeof
5b10: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
5b20: 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28   ) sz = 0;.  if(
5b30: 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30   cnt<0 ) cnt = 0
5b40: 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c  ;.  if( sz==0 ||
5b50: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73   cnt==0 ){.    s
5b60: 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  z = 0;.    pStar
5b70: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
5b80: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
5b90: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
5ba0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
5bb0: 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74    pStart = sqlit
5bc0: 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74  e3Malloc( sz*cnt
5bd0: 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36   );  /* IMP: R-6
5be0: 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20  1949-35727 */.  
5bf0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
5c00: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
5c10: 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74  if( pStart ) cnt
5c20: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
5c30: 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b  Size(pStart)/sz;
5c40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
5c50: 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d  tart = pBuf;.  }
5c60: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
5c70: 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74  .pStart = pStart
5c80: 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ;.  db->lookasid
5c90: 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64  e.pFree = 0;.  d
5ca0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20  b->lookaside.sz 
5cb0: 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28  = (u16)sz;.  if(
5cc0: 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69   pStart ){.    i
5cd0: 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73  nt i;.    Lookas
5ce0: 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20  ideSlot *p;.    
5cf0: 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e  assert( sz > (in
5d00: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
5d10: 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20  deSlot*) );.    
5d20: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
5d30: 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20  ot*)pStart;.    
5d40: 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d  for(i=cnt-1; i>=
5d50: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
5d60: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f  ->pNext = db->lo
5d70: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20  okaside.pFree;. 
5d80: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
5d90: 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20  de.pFree = p;.  
5da0: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
5db0: 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70  deSlot*)&((u8*)p
5dc0: 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  )[sz];.    }.   
5dd0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
5de0: 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d  End = p;.    db-
5df0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
5e00: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d  led = 1;.    db-
5e10: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
5e20: 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f  oced = pBuf==0 ?
5e30: 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1:0;.  }else{.  
5e40: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
5e50: 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20 20  pStart = db;.   
5e60: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
5e70: 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  End = db;.    db
5e80: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
5e90: 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62  bled = 0;.    db
5ea0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
5eb0: 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  loced = 0;.  }. 
5ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5ed0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
5ee0: 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  rn the mutex ass
5ef0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
5f00: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5f10: 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d  on..*/.sqlite3_m
5f20: 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62  utex *sqlite3_db
5f30: 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a  _mutex(sqlite3 *
5f40: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
5f50: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
5f60: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
5f70: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
5f80: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
5f90: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
5fa0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
5fb0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
5fc0: 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78  return db->mutex
5fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
5fe0: 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  up as much memor
5ff0: 79 20 61 73 20 77 65 20 63 61 6e 20 66 72 6f 6d  y as we can from
6000: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
6010: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
6020: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
6030: 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
6040: 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ory(sqlite3 *db)
6050: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  {.  int i;..#ifd
6060: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6070: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
6080: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
6090: 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
60a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
60b0: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
60c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
60d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
60e0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
60f0: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
6100: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
6110: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
6120: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
6130: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
6140: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50  ( pBt ){.      P
6150: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
6160: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
6170: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
6180: 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
6190: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
61a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
61b0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
61c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
61d0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
61e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
61f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
6200: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
6210: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
6220: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
6230: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
6240: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
6250: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
6260: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
6270: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
6280: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
6290: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
62a0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
62b0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
62c0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
62d0: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
62e0: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
62f0: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
6300: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
6310: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
6320: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
6330: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
6340: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
6350: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
6360: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
6370: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
6380: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
6390: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
63a0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
63b0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
63c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
63d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
63e0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
63f0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
6400: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
6410: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
6420: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
6430: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
6440: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
6450: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
6460: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
6470: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
6480: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
6490: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
64a0: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
64b0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
64c0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
64d0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
64e0: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
64f0: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
6500: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
6510: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
6520: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
6530: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
6540: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
6550: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
6560: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
6570: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
6580: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
6590: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
65a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
65b0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
65c0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
65d0: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
65e0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
65f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
6600: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
6610: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
6620: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
6630: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
6640: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
6650: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
6660: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
6670: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
6680: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
6690: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
66a0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
66b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
66c0: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
66d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
66e0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
66f0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
6700: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
6710: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6720: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
6730: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
6740: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
6750: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
6760: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6770: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6780: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
6790: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
67a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
67b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
67c0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
67d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
67e0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
67f0: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
6800: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
6810: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
6820: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
6830: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
6840: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
6850: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
6860: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
6870: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
6880: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
6890: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
68a0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
68b0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
68c0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
68d0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
68e0: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
68f0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
6900: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
6910: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
6920: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
6930: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
6940: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
6950: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
6960: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
6970: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
6980: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
6990: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
69a0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
69b0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
69c0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
69d0: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
69e0: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
69f0: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
6a00: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
6a10: 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34  OF: R-65033-2844
6a20: 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42  9 The built-in B
6a30: 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
6a40: 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74  compares.  ** st
6a50: 72 69 6e 67 73 20 62 79 74 65 20 62 79 20 62 79  rings byte by by
6a60: 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d  te using the mem
6a70: 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  cmp() function f
6a80: 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
6a90: 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e   C.  ** library.
6aa0: 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d   */.  rc = memcm
6ab0: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
6ac0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
6ad0: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
6ae0: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
6af0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
6b00: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
6b10: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
6b20: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
6b30: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
6b40: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   ){.      /* EVI
6b50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32  DENCE-OF: R-3162
6b60: 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20 69 73  4-24737 RTRIM is
6b70: 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63   like BINARY exc
6b80: 65 70 74 20 74 68 61 74 20 65 78 74 72 61 0a 20  ept that extra. 
6b90: 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61       ** spaces a
6ba0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74  t the end of eit
6bb0: 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f  her string do no
6bc0: 74 20 63 68 61 6e 67 65 20 74 68 65 20 72 65 73  t change the res
6bd0: 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20  ult. In other.  
6be0: 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74      ** words, st
6bf0: 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61  rings will compa
6c00: 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20  re equal to one 
6c10: 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20  another as long 
6c20: 61 73 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a  as they.      **
6c30: 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20   differ only in 
6c40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70  the number of sp
6c50: 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e  aces at the end.
6c60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
6c70: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
6c80: 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20  nKey1 - nKey2;. 
6c90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6ca0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
6cb0: 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20  nother built-in 
6cc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
6cd0: 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a  ce: NOCASE. .**.
6ce0: 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e  ** This collatin
6cf0: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e  g sequence is in
6d00: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
6d10: 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65  d for "case inde
6d20: 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61  pendent.** compa
6d30: 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73  rison". SQLite's
6d40: 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70   knowledge of up
6d50: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61  per and lower ca
6d60: 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a  se equivalents.*
6d70: 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74  * extends only t
6d80: 6f 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74  o the 26 charact
6d90: 65 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  ers used in the 
6da0: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
6db0: 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d  ..**.** At the m
6dc0: 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f  oment there is o
6dd0: 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c  nly a UTF-8 impl
6de0: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ementation..*/.s
6df0: 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65  tatic int nocase
6e00: 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20  CollatingFunc(. 
6e10: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
6e20: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
6e30: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
6e40: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
6e50: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
6e60: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69  {.  int r = sqli
6e70: 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20  te3StrNICmp(.   
6e80: 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a     (const char *
6e90: 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63  )pKey1, (const c
6ea0: 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b  har *)pKey2, (nK
6eb0: 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31  ey1<nKey2)?nKey1
6ec0: 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45  :nKey2);.  UNUSE
6ed0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
6ee0: 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72  sed);.  if( 0==r
6ef0: 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79   ){.    r = nKey
6f00: 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72  1-nKey2;.  }.  r
6f10: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
6f20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57  * Return the ROW
6f30: 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ID of the most r
6f40: 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a  ecent insert.*/.
6f50: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c  sqlite_int64 sql
6f60: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
6f70: 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  _rowid(sqlite3 *
6f80: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
6f90: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
6fa0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
6fb0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
6fc0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
6fd0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
6fe0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
6ff0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7000: 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52  return db->lastR
7010: 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  owid;.}../*.** R
7020: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
7030: 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74   of changes in t
7040: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
7050: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
7060: 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xec()..*/.int sq
7070: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71  lite3_changes(sq
7080: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
7090: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
70a0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
70b0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
70c0: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
70d0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
70e0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
70f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
7100: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
7110: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  ->nChange;.}../*
7120: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
7130: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
7140: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
7150: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  ase handle was o
7160: 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pened..*/.int sq
7170: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
7180: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
7190: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
71a0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
71b0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
71c0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
71d0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
71e0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
71f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7200: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
7210: 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  urn db->nTotalCh
7220: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ange;.}../*.** C
7230: 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61  lose all open sa
7240: 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66  vepoints. This f
7250: 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e  unction only man
7260: 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20  ipulates fields 
7270: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
7280: 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  se handle object
7290: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c  , it does not cl
72a0: 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e  ose any savepoin
72b0: 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f  ts that may be o
72c0: 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d  pen.** at the b-
72d0: 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c  tree/pager level
72e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
72f0: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
7300: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
7310: 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76   while( db->pSav
7320: 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61  epoint ){.    Sa
7330: 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20  vepoint *pTmp = 
7340: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
7350: 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69      db->pSavepoi
7360: 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74  nt = pTmp->pNext
7370: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7380: 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20  ree(db, pTmp);. 
7390: 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f   }.  db->nSavepo
73a0: 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  int = 0;.  db->n
73b0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
73c0: 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
73d0: 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  onSavepoint = 0;
73e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
73f0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
7400: 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  function associa
7410: 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65 66  ted with FuncDef
7420: 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65   p, if any. Exce
7430: 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  pt,.** if this i
7440: 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63  s not the last c
7450: 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74  opy of the funct
7460: 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f  ion, do not invo
7470: 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a  ke it. Multiple.
7480: 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73  ** copies of a s
7490: 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61  ingle function a
74a0: 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e 20  re created when 
74b0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
74c0: 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77  ) is called.** w
74d0: 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61  ith SQLITE_ANY a
74e0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a  s the encoding..
74f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7500: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73  unctionDestroy(s
7510: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
7520: 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44  Def *p){.  FuncD
7530: 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74  estructor *pDest
7540: 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65 73  ructor = p->pDes
7550: 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70  tructor;.  if( p
7560: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
7570: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
7580: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
7590: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
75a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65  ==0 ){.      pDe
75b0: 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72  structor->xDestr
75c0: 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  oy(pDestructor->
75d0: 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20  pUserData);.    
75e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
75f0: 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  db, pDestructor)
7600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7610: 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20  *.** Disconnect 
7620: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  all sqlite3_vtab
7630: 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65   objects that be
7640: 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  long to database
7650: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64   connection.** d
7660: 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  b. This is calle
7670: 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69  d when db is bei
7680: 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ng closed..*/.st
7690: 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e  atic void discon
76a0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69  nectAllVtab(sqli
76b0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65  te3 *db){.#ifnde
76c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
76d0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74  RTUALTABLE.  int
76e0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   i;.  sqlite3Btr
76f0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
7700: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
7710: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
7720: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
7730: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  = db->aDb[i].pSc
7740: 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64 62  hema;.    if( db
7750: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
7760: 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c   ){.      HashEl
7770: 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  em *p;.      for
7780: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
7790: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  st(&pSchema->tbl
77a0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
77b0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
77c0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
77d0: 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73  Tab = (Table *)s
77e0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
77f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  ;.        if( Is
7800: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
7810: 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f  sqlite3VtabDisco
7820: 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b  nnect(db, pTab);
7830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7840: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
7850: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
7860: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
7870: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73  aveAll(db);.#els
7880: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
7890: 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66  ETER(db);.#endif
78a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
78b0: 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61 73   TRUE if databas
78c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
78d0: 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  has unfinalized 
78e0: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
78f0: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
7900: 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63  shed sqlite3_bac
7910: 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a  kup objects.  .*
7920: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
7930: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71  nectionIsBusy(sq
7940: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
7950: 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t j;.  assert( s
7960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7970: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
7980: 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20    if( db->pVdbe 
7990: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
79a0: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
79b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; j++){.    Btre
79c0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
79d0: 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [j].pBt;.    if(
79e0: 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42   pBt && sqlite3B
79f0: 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70  treeIsInBackup(p
7a00: 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Bt) ) return 1;.
7a10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
7a30: 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74  n existing SQLit
7a40: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74  e database.*/.st
7a50: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
7a60: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  Close(sqlite3 *d
7a70: 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62  b, int forceZomb
7a80: 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29  ie){.  if( !db )
7a90: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
7aa0: 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31  E-OF: R-63257-11
7ab0: 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69  740 Calling sqli
7ac0: 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20  te3_close() or. 
7ad0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c     ** sqlite3_cl
7ae0: 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20 61 20  ose_v2() with a 
7af0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67  NULL pointer arg
7b00: 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c  ument is a harml
7b10: 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  ess no-op. */.  
7b20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7b30: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  OK;.  }.  if( !s
7b40: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
7b50: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
7b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7b70: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7b80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
7b90: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7ba0: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63  tex);..  /* Forc
7bb0: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61  e xDisconnect ca
7bc0: 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75  lls on all virtu
7bd0: 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64  al tables */.  d
7be0: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
7bf0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  (db);..  /* If a
7c00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7c10: 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e  open, the discon
7c20: 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61  nectAllVtab() ca
7c30: 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69  ll above.  ** wi
7c40: 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c  ll not have call
7c50: 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ed the xDisconne
7c60: 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61  ct() method on a
7c70: 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  ny virtual.  ** 
7c80: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62  tables in the db
7c90: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
7ca0: 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  y. The following
7cb0: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
7cc0: 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c  back().  ** call
7cd0: 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20   will do so. We 
7ce0: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
7cf0: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
7d00: 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a   for active.  **
7d10: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
7d20: 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d  below, as the v-
7d30: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
7d40: 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72  tion may be stor
7d50: 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72  ing.  ** some pr
7d60: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
7d70: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  s internally..  
7d80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  */.  sqlite3Vtab
7d90: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20  Rollback(db);.. 
7da0: 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76   /* Legacy behav
7db0: 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f  ior (sqlite3_clo
7dc0: 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69  se() behavior) i
7dd0: 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  s to return.  **
7de0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20   SQLITE_BUSY if 
7df0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
7e00: 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  an not be closed
7e10: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
7e20: 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a  */.  if( !forceZ
7e30: 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74  ombie && connect
7e40: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
7e50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7e60: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
7e70: 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c  ITE_BUSY, "unabl
7e80: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
7e90: 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a  o unfinalized ".
7ea0: 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e         "statemen
7eb0: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
7ec0: 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20   backups");.    
7ed0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7ee0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7ef0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7f00: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66  E_BUSY;.  }..#if
7f10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7f20: 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
7f30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
7f40: 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
7f50: 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65    /* Closing the
7f60: 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
7f70: 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
7f80: 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e  sed the value 2.
7f90: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47   */.    sqlite3G
7fa0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
7fb0: 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  log(sqlite3Globa
7fc0: 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
7fd0: 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20  rg, db, 0, 2);. 
7fe0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7ff0: 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e  Convert the conn
8000: 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f  ection into a zo
8010: 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c  mbie and then cl
8020: 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64  ose it..  */.  d
8030: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
8040: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a  E_MAGIC_ZOMBIE;.
8050: 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75    sqlite3LeaveMu
8060: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
8070: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
8080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8090: 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f  .** Two variatio
80a0: 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63  ns on the public
80b0: 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63   interface for c
80c0: 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  losing a databas
80d0: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
80e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f   The sqlite3_clo
80f0: 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74  se() version ret
8100: 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
8110: 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74   and.** leaves t
8120: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
8130: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
8140: 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72  e unfinalized pr
8150: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
8160: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
8170: 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ed sqlite3_backu
8180: 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ps.  The sqlite3
8190: 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76  _close_v2().** v
81a0: 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68  ersion forces th
81b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
81c0: 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20  become a zombie 
81d0: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
81e0: 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63  unclosed resourc
81f0: 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73  es, and arranges
8200: 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f   for deallocatio
8210: 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a  n when the last.
8220: 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65  ** prepare state
8230: 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f  ment or sqlite3_
8240: 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a  backup closes..*
8250: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  /.int sqlite3_cl
8260: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ose(sqlite3 *db)
8270: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
8280: 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69  Close(db,0); }.i
8290: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
82a0: 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _v2(sqlite3 *db)
82b0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
82c0: 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a  Close(db,1); }..
82d0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
82e0: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
82f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
8300: 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d  ..**.** Furtherm
8310: 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65  ore, if database
8320: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
8330: 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e  s a zombie (mean
8340: 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a  ing that there.*
8350: 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69  * has been a pri
8360: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
8370: 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20  e3_close(db) or 
8380: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8390: 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65  (db)) and.** eve
83a0: 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ry sqlite3_stmt 
83b0: 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e  has now been fin
83c0: 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79  alized and every
83d0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
83e0: 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c  has.** finished,
83f0: 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72   then free all r
8400: 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69  esources..*/.voi
8410: 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75  d sqlite3LeaveMu
8420: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
8430: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
8440: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20    HashElem *i;  
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
8470: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  iterator */.  in
8480: 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t j;..  /* If th
8490: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
84a0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ing sqlite3_stmt
84b0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   or sqlite3_back
84c0: 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20  up objects.  ** 
84d0: 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  or if the connec
84e0: 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  tion has not yet
84f0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20   been closed by 
8500: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8510: 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75  (),.  ** then ju
8520: 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74  st leave the mut
8530: 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ex and return.. 
8540: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
8550: 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic!=SQLITE_MAGI
8560: 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e  C_ZOMBIE || conn
8570: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29  ectionIsBusy(db)
8580: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8590: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
85a0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
85b0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rn;.  }..  /* If
85c0: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
85d0: 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
85e0: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
85f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a   connection has.
8600: 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20    ** closed all 
8610: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64  sqlite3_stmt and
8620: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8630: 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20  objects and has 
8640: 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64  been.  ** passed
8650: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
8660: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
8670: 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e  it is a zombie).
8680: 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a    Therefore,.  *
8690: 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66  * go ahead and f
86a0: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
86b0: 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  s..  */..  /* If
86c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
86d0: 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20  s open, roll it 
86e0: 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20  back. This also 
86f0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a  ensures that if.
8700: 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73    ** any databas
8710: 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62  e schemas have b
8720: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20  een modified by 
8730: 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74  an uncommitted t
8740: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
8750: 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20  they are reset. 
8760: 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71  And that the req
8770: 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  uired b-tree mut
8780: 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61  ex is held to ma
8790: 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ke.  ** the page
87a0: 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
87b0: 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61  chema reset an a
87c0: 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e  tomic operation.
87d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c   */.  sqlite3Rol
87e0: 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
87f0: 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46  ITE_OK);..  /* F
8800: 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  ree any outstand
8810: 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74  ing Savepoint st
8820: 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73  ructures. */.  s
8830: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
8840: 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a  oints(db);..  /*
8850: 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62   Close all datab
8860: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
8870: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
8880: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
8890: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
88a0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b  b = &db->aDb[j];
88b0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
88c0: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
88d0: 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Db->pSchema ){. 
88e0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 63         /* Must c
88f0: 6c 65 61 72 20 74 68 65 20 4b 65 79 49 6e 66 6f  lear the KeyInfo
8900: 20 63 61 63 68 65 2e 20 20 53 65 65 20 74 69 63   cache.  See tic
8910: 6b 65 74 20 5b 65 34 61 31 38 35 36 35 61 33 36  ket [e4a18565a36
8920: 38 38 34 62 30 30 65 64 66 5d 20 2a 2f 0a 20 20  884b00edf] */.  
8930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
8940: 65 65 45 6e 74 65 72 28 70 44 62 2d 3e 70 42 74  eeEnter(pDb->pBt
8950: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
8960: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
8970: 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
8980: 69 64 78 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  idxHash); i; i=s
8990: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
89a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 6e 64  ){.          Ind
89b0: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
89c0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
89d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
89e0: 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 49 64 78  eyInfoUnref(pIdx
89f0: 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  ->pKeyInfo);.   
8a00: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 4b 65         pIdx->pKe
8a10: 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20  yInfo = 0;.     
8a20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
8a30: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
8a40: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
8a50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
8a60: 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70  treeClose(pDb->p
8a70: 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  Bt);.      pDb->
8a80: 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pBt = 0;.      i
8a90: 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20  f( j!=1 ){.     
8aa0: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20     pDb->pSchema 
8ab0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
8ac0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61   }.  }.  /* Clea
8ad0: 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d  r the TEMP schem
8ae0: 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64  a separately and
8af0: 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64   last */.  if( d
8b00: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
8b10: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
8b20: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
8b30: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
8b40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
8b50: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
8b60: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20  ;..  /* Free up 
8b70: 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75 78  the array of aux
8b80: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
8b90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   */.  sqlite3Col
8ba0: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
8bb0: 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ay(db);.  assert
8bc0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
8bd0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
8be0: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
8bf0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74   );..  /* Tell t
8c00: 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66  he code in notif
8c10: 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e  y.c that the con
8c20: 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65  nection no longe
8c30: 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a  r holds any.  **
8c40: 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20   locks and does 
8c50: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
8c60: 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e  further unlock-n
8c70: 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
8c80: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
8c90: 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28  onnectionClosed(
8ca0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  db);..  for(j=0;
8cb0: 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64 62 2d   j<ArraySize(db-
8cc0: 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b  >aFunc.a); j++){
8cd0: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e  .    FuncDef *pN
8ce0: 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b  ext, *pHash, *p;
8cf0: 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61  .    for(p=db->a
8d00: 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d  Func.a[j]; p; p=
8d10: 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 70 48  pHash){.      pH
8d20: 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a  ash = p->pHash;.
8d30: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 29        while( p )
8d40: 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74 69  {.        functi
8d50: 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29  onDestroy(db, p)
8d60: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  ;.        pNext 
8d70: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
8d80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8d90: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
8da0: 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20    p = pNext;.   
8db0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8dc0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
8dd0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
8de0: 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69  lSeq); i; i=sqli
8df0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
8e00: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
8e10: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
8e20: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
8e30: 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  );.    /* Invoke
8e40: 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73   any destructors
8e50: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
8e60: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8e70: 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f  ce user data. */
8e80: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
8e90: 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  3; j++){.      i
8ea0: 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c  f( pColl[j].xDel
8eb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
8ec0: 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b  l[j].xDel(pColl[
8ed0: 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  j].pUser);.     
8ee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8ef0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8f00: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Coll);.  }.  sql
8f10: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
8f20: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
8f30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8f40: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
8f50: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
8f60: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
8f70: 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ule); i; i=sqlit
8f80: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
8f90: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
8fa0: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
8fb0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
8fc0: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65     if( pMod->xDe
8fd0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70  stroy ){.      p
8fe0: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d  Mod->xDestroy(pM
8ff0: 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  od->pAux);.    }
9000: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
9010: 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20  ee(db, pMod);.  
9020: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
9030: 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  lear(&db->aModul
9040: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  e);.#endif..  sq
9050: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
9060: 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65  QLITE_OK); /* De
9070: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61  allocates any ca
9080: 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e  ched error strin
9090: 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  gs. */.  sqlite3
90a0: 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45  ValueFree(db->pE
90b0: 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c  rr);.  sqlite3Cl
90c0: 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oseExtensions(db
90d0: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
90e0: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
90f0: 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  N.  sqlite3_free
9100: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55  (db->auth.zAuthU
9110: 73 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ser);.  sqlite3_
9120: 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41  free(db->auth.zA
9130: 75 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a  uthPW);.#endif..
9140: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
9150: 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
9160: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70  ;..  /* The temp
9170: 2d 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  -database schema
9180: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69   is allocated di
9190: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
91a0: 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a  he other schema.
91b0: 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73    ** objects (us
91c0: 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ing sqliteMalloc
91d0: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  () directly, ins
91e0: 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42  tead of sqlite3B
91f0: 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20  treeSchema()).. 
9200: 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20   ** So it needs 
9210: 74 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65  to be freed here
9220: 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20  . Todo: Why not 
9230: 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63  roll the temp sc
9240: 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  hema into.  ** t
9250: 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61  he same sqliteMa
9260: 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e  lloc() as the on
9270: 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73  e that allocates
9280: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
9290: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20   ** structure?. 
92a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
92b0: 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  ree(db, db->aDb[
92c0: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  1].pSchema);.  s
92d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
92e0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
92f0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
9300: 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
9310: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9320: 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78  x_free(db->mutex
9330: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
9340: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d  >lookaside.nOut=
9350: 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20  =0 );  /* Fails 
9360: 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  on a lookaside m
9370: 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20  emory leak */.  
9380: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
9390: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20  e.bMalloced ){. 
93a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
93b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
93c0: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tart);.  }.  sql
93d0: 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d  ite3_free(db);.}
93e0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
93f0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
9400: 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64  les.  If tripCod
9410: 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
9420: 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20  OK, then.** any 
9430: 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
9440: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22  e invalidated ("
9450: 74 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e  tripped" - as in
9460: 20 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72   "tripping a cir
9470: 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22  cuit.** breaker"
9480: 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65  ) and made to re
9490: 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66  turn tripCode if
94a0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66   there are any f
94b0: 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70  urther.** attemp
94c0: 74 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ts to use that c
94d0: 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72  ursor.  Read cur
94e0: 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e  sors remain open
94f0: 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75   and valid.** bu
9500: 74 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e  t are "saved" in
9510: 20 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20   case the table 
9520: 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20  pages are moved 
9530: 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20  around..*/.void 
9540: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
9550: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
9560: 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20  int tripCode){. 
9570: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e   int i;.  int in
9580: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74  Trans = 0;.  int
9590: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20   schemaChange;. 
95a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
95b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
95c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
95d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
95e0: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62  lloc();..  /* Ob
95f0: 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20  tain all b-tree 
9600: 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d  mutexes before m
9610: 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20  aking any calls 
9620: 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  to BtreeRollback
9630: 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69  (). .  ** This i
9640: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63  s important in c
9650: 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
9660: 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  ion being rolled
9670: 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d   back has.  ** m
9680: 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
9690: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
96a0: 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
96b0: 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e  es are not taken
96c0: 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e  .  ** here, then
96d0: 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d   another shared-
96e0: 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  cache connection
96f0: 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20   might sneak in 
9700: 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
9710: 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61   database rollba
9720: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
9730: 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63  set, which can c
9740: 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20  ause false.  ** 
9750: 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72  corruption repor
9760: 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  ts in some cases
9770: 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
9780: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
9790: 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65  ;.  schemaChange
97a0: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
97b0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
97c0: 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e  nges)!=0 && db->
97d0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20  init.busy==0;.. 
97e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
97f0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
9800: 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44  tree *p = db->aD
9810: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
9820: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( p ){.      if(
9830: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
9840: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
9850: 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31       inTrans = 1
9860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9870: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
9880: 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65  back(p, tripCode
9890: 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29  , !schemaChange)
98a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
98b0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
98c0: 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  k(db);.  sqlite3
98d0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
98e0: 29 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  );..  if( (db->f
98f0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
9900: 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26  rnChanges)!=0 &&
9910: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
9920: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
9930: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
9940: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
9950: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
9960: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
9970: 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20  tion(db);.  }.  
9980: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
9990: 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
99a0: 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e  Any deferred con
99b0: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
99c0: 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  ns have now been
99d0: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
99e0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
99f0: 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65  s = 0;.  db->nDe
9a00: 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
9a10: 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  0;.  db->flags &
9a20: 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46  = ~SQLITE_DeferF
9a30: 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  Ks;..  /* If one
9a40: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
9a50: 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65  ured, invoke the
9a60: 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63   rollback-hook c
9a70: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  allback */.  if(
9a80: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
9a90: 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61  llback && (inTra
9aa0: 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43  ns || !db->autoC
9ab0: 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62  ommit) ){.    db
9ac0: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
9ad0: 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ack(db->pRollbac
9ae0: 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  kArg);.  }.}../*
9af0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61  .** Return a sta
9b00: 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  tic string conta
9b10: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63  ining the name c
9b20: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
9b30: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
9b40: 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  * specified in t
9b50: 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
9b60: 23 69 66 20 28 64 65 66 69 6e 65 64 28 53 51 4c  #if (defined(SQL
9b70: 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 53 51  ITE_DEBUG) && SQ
9b80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 29 20 7c 7c 20  LITE_OS_WIN) || 
9b90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
9ba0: 45 53 54 29 0a 63 6f 6e 73 74 20 63 68 61 72 20  EST).const char 
9bb0: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
9bc0: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
9bd0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
9be0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52  ;.  int i, origR
9bf0: 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  c = rc;.  for(i=
9c00: 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d  0; i<2 && zName=
9c10: 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30  =0; i++, rc &= 0
9c20: 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68  xff){.    switch
9c30: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
9c40: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9c60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
9c70: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
9c80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9c90: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
9ca0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
9cb0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
9cc0: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
9cd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9ce0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
9cf0: 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20  RNAL:           
9d00: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9d10: 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20  INTERNAL";      
9d20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9d30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
9d40: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
9d50: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9d60: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20  _PERM";         
9d70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9d80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
9d90: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
9da0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9db0: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
9dc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9dd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
9de0: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  BORT_ROLLBACK:  
9df0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9e00: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
9e10: 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  K";    break;.  
9e20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9e30: 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20  BUSY:           
9e40: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9e50: 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20  ITE_BUSY";      
9e60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9e70: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9e80: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20  _BUSY_RECOVERY: 
9e90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9ea0: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
9eb0: 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  RY";     break;.
9ec0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9ed0: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a  E_BUSY_SNAPSHOT:
9ee0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9ef0: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
9f00: 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  HOT";     break;
9f10: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9f20: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20  TE_LOCKED:      
9f30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9f40: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
9f50: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9f60: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9f70: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
9f80: 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20  DCACHE: zName = 
9f90: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  "SQLITE_LOCKED_S
9fa0: 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61  HAREDCACHE";brea
9fb0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9fc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
9fd0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9fe0: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a000: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a010: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
a020: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a030: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
a040: 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  LY";          br
a050: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a060: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a070: 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65  RECOVERY:  zName
a080: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
a090: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62  NLY_RECOVERY"; b
a0a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a0b0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
a0c0: 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d  _CANTLOCK:  zNam
a0d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
a0e0: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20  ONLY_CANTLOCK"; 
a0f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a100: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
a110: 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61  Y_ROLLBACK:  zNa
a120: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
a130: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b  DONLY_ROLLBACK";
a140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a150: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
a160: 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e  LY_DBMOVED:   zN
a170: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
a180: 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b  ADONLY_DBMOVED";
a190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a1a0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
a1b0: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a  RUPT:          z
a1c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a1d0: 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20  NTERRUPT";      
a1e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a1f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a200: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
a210: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a220: 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20  IOERR";         
a230: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a240: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a250: 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20  RR_READ:        
a260: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a270: 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20  _IOERR_READ";   
a280: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a290: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a2a0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
a2b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a2c0: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
a2d0: 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AD";  break;.   
a2e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a2f0: 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20  OERR_WRITE:     
a300: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a310: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
a320: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a330: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a340: 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20  IOERR_FSYNC:    
a350: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a360: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22  ITE_IOERR_FSYNC"
a370: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
a380: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a390: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
a3a0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
a3b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
a3c0: 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SYNC";   break;.
a3d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a3e0: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
a3f0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
a400: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
a410: 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b  CATE";    break;
a420: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a430: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20  TE_IOERR_FSTAT: 
a440: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a450: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
a460: 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  AT";       break
a470: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a480: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
a490: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
a4a0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  "SQLITE_IOERR_UN
a4b0: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
a4c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a4d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
a4e0: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
a4f0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
a500: 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  DLOCK";      bre
a510: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a520: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
a530: 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  TE:       zName 
a540: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
a550: 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72  DELETE";      br
a560: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a570: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
a580: 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  EM:        zName
a590: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
a5a0: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62  _NOMEM";       b
a5b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a5c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
a5d0: 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d  CESS:       zNam
a5e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a5f0: 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20  R_ACCESS";      
a600: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a610: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
a620: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
a630: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a660: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
a670: 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61  ERVEDLOCK"; brea
a680: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a690: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a  LITE_IOERR_LOCK:
a6a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a6b0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c   "SQLITE_IOERR_L
a6c0: 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  OCK";        bre
a6d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a6e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
a6f0: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
a700: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
a710: 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72  CLOSE";       br
a720: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
a740: 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65  _CLOSE:    zName
a750: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
a760: 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62  _DIR_CLOSE";   b
a770: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a780: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
a790: 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d  MOPEN:      zNam
a7a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a7b0: 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20  R_SHMOPEN";     
a7c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a7d0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
a7e0: 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61  HMSIZE:      zNa
a7f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a800: 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20  RR_SHMSIZE";    
a810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a820: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a830: 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e  SHMLOCK:      zN
a840: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a850: 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20  ERR_SHMLOCK";   
a860: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a870: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a880: 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a  _SHMMAP:       z
a890: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a8a0: 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20  OERR_SHMMAP";   
a8b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a8c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a8d0: 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20  R_SEEK:         
a8e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a8f0: 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20  IOERR_SEEK";    
a900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a910: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a920: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a  RR_DELETE_NOENT:
a930: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a940: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
a950: 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ENT";break;.    
a960: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a970: 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20  ERR_MMAP:       
a980: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a990: 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20  E_IOERR_MMAP";  
a9a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a9b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a9c0: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
a9d0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
a9e0: 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
a9f0: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
aa00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
aa10: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20  IOERR_CONVPATH: 
aa20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aa30: 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
aa40: 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TH";    break;. 
aa50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
aa60: 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20  _CORRUPT:       
aa70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
aa80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20  LITE_CORRUPT";  
aa90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
aaa0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
aab0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20  E_CORRUPT_VTAB: 
aac0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
aad0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
aae0: 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AB";      break;
aaf0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ab00: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20  TE_NOTFOUND:    
ab10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ab20: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22  SQLITE_NOTFOUND"
ab30: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
ab40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ab50: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
ab60: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ab70: 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20  "SQLITE_FULL";  
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ab90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aba0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
abb0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
abc0: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
abd0: 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  N";          bre
abe0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
abf0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
ac00: 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20  OTEMPDIR: zName 
ac10: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
ac20: 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72  EN_NOTEMPDIR";br
ac30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ac40: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
ac50: 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65  ISDIR:     zName
ac60: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
ac70: 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62  PEN_ISDIR";    b
ac80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ac90: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
aca0: 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d  _FULLPATH:  zNam
acb0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
acc0: 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20  OPEN_FULLPATH"; 
acd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ace0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
acf0: 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61  N_CONVPATH:  zNa
ad00: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
ad10: 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b  TOPEN_CONVPATH";
ad20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ad30: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
ad40: 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  OL:           zN
ad50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52  ame = "SQLITE_PR
ad60: 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20  OTOCOL";        
ad70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ad80: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
ad90: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
ada0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
adb0: 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20  MPTY";          
adc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
add0: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
ade0: 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  MA:             
adf0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ae00: 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20  SCHEMA";        
ae10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ae20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
ae30: 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  BIG:            
ae40: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ae50: 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20  _TOOBIG";       
ae60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ae70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
ae80: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
ae90: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aea0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20  E_CONSTRAINT";  
aeb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aec0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
aed0: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
aee0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
aef0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
af00: 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  IQUE"; break;.  
af10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af20: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
af30: 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  ER: zName = "SQL
af40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
af50: 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20  RIGGER";break;. 
af60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
af70: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
af80: 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  IGNKEY:.        
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
afb0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
afc0: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20  NT_FOREIGNKEY"; 
afd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
afe0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
aff0: 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a  RAINT_CHECK:   z
b000: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b010: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22  ONSTRAINT_CHECK"
b020: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
b030: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b040: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
b050: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b080: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
b090: 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65  IMARYKEY";   bre
b0a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b0b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b0c0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20  _NOTNULL: zName 
b0d0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b0e0: 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72  AINT_NOTNULL";br
b0f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b100: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b110: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20  T_COMMITHOOK:.  
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b140: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b150: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
b160: 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OOK";   break;. 
b170: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b180: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
b190: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
b1a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b1b0: 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a  VTAB";   break;.
b1c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b1d0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
b1e0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20  CTION:.         
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b210: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b220: 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20  T_FUNCTION";    
b230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b240: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b250: 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e  AINT_ROWID:   zN
b260: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b270: 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b  NSTRAINT_ROWID";
b280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b290: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  ase SQLITE_MISMA
b2a0: 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a  TCH:           z
b2b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
b2c0: 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20  ISMATCH";       
b2d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b2e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55  case SQLITE_MISU
b2f0: 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SE:             
b300: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b310: 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20  MISUSE";        
b320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b330: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c   case SQLITE_NOL
b340: 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  FS:             
b350: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b360: 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20  _NOLFS";        
b370: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b380: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55    case SQLITE_AU
b390: 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TH:             
b3a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b3b0: 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20  E_AUTH";        
b3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
b3e0: 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20  ORMAT:          
b3f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b400: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
b410: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b420: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b430: 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20  RANGE:          
b440: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b450: 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20  ITE_RANGE";     
b460: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b470: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b480: 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20  _NOTADB:        
b490: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b4a0: 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20  LITE_NOTADB";   
b4b0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b4c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b4d0: 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20  E_ROW:          
b4e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b4f0: 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20  QLITE_ROW";     
b500: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b510: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b520: 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20  TE_NOTICE:      
b530: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b540: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20  SQLITE_NOTICE"; 
b550: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b560: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b570: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
b580: 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20  ER_WAL: zName = 
b590: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
b5a0: 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61  ECOVER_WAL";brea
b5b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b5c0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
b5d0: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20  VER_ROLLBACK:.  
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b600: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
b610: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
b620: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
b630: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b640: 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20  _WARNING:       
b650: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b660: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20  LITE_WARNING";  
b670: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b680: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b690: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
b6a0: 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  DEX:  zName = "S
b6b0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
b6c0: 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  TOINDEX"; break;
b6d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b6e0: 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20  TE_DONE:        
b6f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b700: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20  SQLITE_DONE";   
b710: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b720: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
b730: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
b740: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42    static char zB
b750: 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69  uf[50];.    sqli
b760: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
b770: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
b780: 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e   "SQLITE_UNKNOWN
b790: 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a  (%d)", origRc);.
b7a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66      zName = zBuf
b7b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
b7c0: 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
b7d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
b7e0: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
b7f0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
b800: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
b810: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
b820: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
b830: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
b840: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
b850: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
b860: 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73   char* const aMs
b870: 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53  g[] = {.    /* S
b880: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
b890: 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72    */ "not an err
b8a0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
b8b0: 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a  TE_ERROR       *
b8c0: 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72  / "SQL logic err
b8d0: 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61  or or missing da
b8e0: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
b8f0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20  SQLITE_INTERNAL 
b900: 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20     */ 0,.    /* 
b910: 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20  SQLITE_PERM     
b920: 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65     */ "access pe
b930: 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22  rmission denied"
b940: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
b950: 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22  ABORT       */ "
b960: 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74  callback request
b970: 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c  ed query abort",
b980: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42  .    /* SQLITE_B
b990: 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64  USY        */ "d
b9a0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
b9b0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
b9c0: 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f  E_LOCKED      */
b9d0: 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65   "database table
b9e0: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
b9f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   /* SQLITE_NOMEM
ba00: 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f         */ "out o
ba10: 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f  f memory",.    /
ba20: 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  * SQLITE_READONL
ba30: 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74  Y    */ "attempt
ba40: 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64   to write a read
ba50: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a  only database",.
ba60: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
ba70: 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e  TERRUPT   */ "in
ba80: 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20  terrupted",.    
ba90: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  /* SQLITE_IOERR 
baa0: 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49        */ "disk I
bab0: 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  /O error",.    /
bac0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
bad0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
bae0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
baf0: 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20  malformed",.    
bb00: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  /* SQLITE_NOTFOU
bb10: 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77  ND    */ "unknow
bb20: 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20  n operation",.  
bb30: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c    /* SQLITE_FULL
bb40: 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61          */ "data
bb50: 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20  base or disk is 
bb60: 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  full",.    /* SQ
bb70: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20  LITE_CANTOPEN   
bb80: 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f   */ "unable to o
bb90: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
bba0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
bbb0: 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f  E_PROTOCOL    */
bbc0: 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63   "locking protoc
bbd0: 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ol",.    /* SQLI
bbe0: 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a  TE_EMPTY       *
bbf0: 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  / "table contain
bc00: 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20  s no data",.    
bc10: 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  /* SQLITE_SCHEMA
bc20: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
bc30: 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
bc40: 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  anged",.    /* S
bc50: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20  QLITE_TOOBIG    
bc60: 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20    */ "string or 
bc70: 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20  blob too big",. 
bc80: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     /* SQLITE_CON
bc90: 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e  STRAINT  */ "con
bca0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c  straint failed",
bcb0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
bcc0: 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64  ISMATCH    */ "d
bcd0: 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
bce0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bcf0: 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20  _MISUSE      */ 
bd00: 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65  "library routine
bd10: 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73   called out of s
bd20: 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a  equence",.    /*
bd30: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20   SQLITE_NOLFS   
bd40: 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69      */ "large fi
bd50: 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69  le support is di
bd60: 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  sabled",.    /* 
bd70: 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20  SQLITE_AUTH     
bd80: 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61     */ "authoriza
bd90: 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  tion denied",.  
bda0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d    /* SQLITE_FORM
bdb0: 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69  AT      */ "auxi
bdc0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
bdd0: 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20  ormat error",.  
bde0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47    /* SQLITE_RANG
bdf0: 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64  E       */ "bind
be00: 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78   or column index
be10: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a   out of range",.
be20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
be30: 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69  TADB      */ "fi
be40: 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20  le is encrypted 
be50: 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61  or is not a data
be60: 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f  base",.  };.  co
be70: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
be80: 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22   "unknown error"
be90: 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29  ;.  switch( rc )
bea0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
beb0: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
bec0: 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d  : {.      zErr =
bed0: 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52   "abort due to R
bee0: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
bef0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
bf00: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
bf10: 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20    rc &= 0xff;.  
bf20: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 72      if( ALWAYS(r
bf30: 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72 61  c>=0) && rc<Arra
bf40: 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20 61  ySize(aMsg) && a
bf50: 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20  Msg[rc]!=0 ){.  
bf60: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d 73        zErr = aMs
bf70: 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  g[rc];.      }. 
bf80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bf90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
bfa0: 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Err;.}../*.** Th
bfb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
bfc0: 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c  ments a busy cal
bfd0: 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70  lback that sleep
bfe0: 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61  s and tries.** a
bff0: 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d  gain until a tim
c000: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65  eout value is re
c010: 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65  ached.  The time
c020: 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  out value is.** 
c030: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
c040: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
c050: 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74  s passed in as t
c060: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
c070: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
c080: 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c  int sqliteDefaul
c090: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20  tBusyCallback(. 
c0a0: 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20  void *ptr,      
c0b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
c0c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
c0d0: 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20  */. int count   
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c0f0: 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  Number of times 
c100: 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62  table has been b
c110: 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51  usy */.){.#if SQ
c120: 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28  LITE_OS_WIN || (
c130: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
c140: 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
c150: 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f  EEP).  static co
c160: 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20  nst u8 delays[] 
c170: 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35  =.     { 1, 2, 5
c180: 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35  , 10, 15, 20, 25
c190: 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20  , 25,  25,  50, 
c1a0: 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74   50, 100 };.  st
c1b0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f  atic const u8 to
c1c0: 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  tals[] =.     { 
c1d0: 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c  0, 1, 3,  8, 18,
c1e0: 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33   33, 53, 78, 103
c1f0: 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20  , 128, 178, 228 
c200: 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c  };.# define NDEL
c210: 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c  AY ArraySize(del
c220: 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  ays).  sqlite3 *
c230: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
c240: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
c250: 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d  ut = db->busyTim
c260: 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61  eout;.  int dela
c270: 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73  y, prior;..  ass
c280: 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b  ert( count>=0 );
c290: 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e  .  if( count < N
c2a0: 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c  DELAY ){.    del
c2b0: 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e  ay = delays[coun
c2c0: 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  t];.    prior = 
c2d0: 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20  totals[count];. 
c2e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61   }else{.    dela
c2f0: 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41  y = delays[NDELA
c300: 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  Y-1];.    prior 
c310: 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d  = totals[NDELAY-
c320: 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e  1] + delay*(coun
c330: 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20  t-(NDELAY-1));. 
c340: 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b   }.  if( prior +
c350: 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74   delay > timeout
c360: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
c370: 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b  timeout - prior;
c380: 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d  .    if( delay<=
c390: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c3a0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
c3b0: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c  ep(db->pVfs, del
c3c0: 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75  ay*1000);.  retu
c3d0: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71  rn 1;.#else.  sq
c3e0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
c3f0: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
c400: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71  t timeout = ((sq
c410: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
c420: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28  syTimeout;.  if(
c430: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
c440: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
c450: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c460: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
c470: 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30  db->pVfs, 100000
c480: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
c490: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
c4a0: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
c4b0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a   busy handler..*
c4c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c4d0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
c4e0: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61   an operation fa
c4f0: 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b  iled with a lock
c500: 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  ..** If this rou
c510: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
c520: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
c530: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
c540: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
c550: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
c560: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
c570: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
c580: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
c590: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
c5a0: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29  (BusyHandler *p)
c5b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
c5c0: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c  ( NEVER(p==0) ||
c5d0: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20   p->xFunc==0 || 
c5e0: 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74  p->nBusy<0 ) ret
c5f0: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d  urn 0;.  rc = p-
c600: 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20  >xFunc(p->pArg, 
c610: 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28  p->nBusy);.  if(
c620: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d   rc==0 ){.    p-
c630: 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d  >nBusy = -1;.  }
c640: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  else{.    p->nBu
c650: 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sy++;.  }.  retu
c660: 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn rc; .}../*.**
c670: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
c680: 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ts the busy call
c690: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
c6a0: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
c6b0: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
c6c0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
c6d0: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
c6e0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
c6f0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
c700: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
c710: 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  b,.  int (*xBusy
c720: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20  )(void*,int),.  
c730: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69  void *pArg.){.#i
c740: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c750: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
c760: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
c770: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
c780: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
c790: 55 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  USE;.#endif.  sq
c7a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c7b0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c7c0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
c7d0: 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20  xFunc = xBusy;. 
c7e0: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
c7f0: 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  .pArg = pArg;.  
c800: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
c810: 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62 2d  nBusy = 0;.  db-
c820: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30  >busyTimeout = 0
c830: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
c840: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
c850: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
c860: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
c870: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
c880: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
c890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c8a0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f  ine sets the pro
c8b0: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66  gress callback f
c8c0: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
c8d0: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
c8e0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
c8f0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
c900: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
c910: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
c920: 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62  llback will.** b
c930: 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20  e invoked every 
c940: 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f  nOps opcodes..*/
c950: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72  .void sqlite3_pr
c960: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a  ogress_handler(.
c970: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
c980: 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e    int nOps,.  in
c990: 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76  t (*xProgress)(v
c9a0: 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a  oid*), .  void *
c9b0: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
c9c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
c9d0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
c9e0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
c9f0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
ca00: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
ca10: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
ca20: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
ca30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ca40: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
ca50: 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b  .  if( nOps>0 ){
ca60: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
ca70: 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a  ss = xProgress;.
ca80: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
ca90: 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64  sOps = (unsigned
caa0: 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70  )nOps;.    db->p
cab0: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41  ProgressArg = pA
cac0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
cad0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
cae0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f   0;.    db->nPro
caf0: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
cb00: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
cb10: 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  rg = 0;.  }.  sq
cb20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
cb30: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
cb40: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
cb50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74  his routine inst
cb60: 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62  alls a default b
cb70: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74  usy handler that
cb80: 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a   waits for the.*
cb90: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62  * specified numb
cba0: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
cbb0: 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ds before return
cbc0: 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ing 0..*/.int sq
cbd0: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
cbe0: 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ut(sqlite3 *db, 
cbf0: 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20  int ms){.#ifdef 
cc00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
cc10: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
cc20: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
cc30: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
cc40: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
cc50: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  KPT;.#endif.  if
cc60: 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71  ( ms>0 ){.    sq
cc70: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
cc80: 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66  er(db, sqliteDef
cc90: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
cca0: 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20  , (void*)db);.  
ccb0: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
ccc0: 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b  t = ms;.  }else{
ccd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
cce0: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c  y_handler(db, 0,
ccf0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
cd00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cd10: 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20  /*.** Cause any 
cd20: 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f  pending operatio
cd30: 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73  n to stop at its
cd40: 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74   earliest opport
cd50: 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  unity..*/.void s
cd60: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
cd70: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
cd80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cd90: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
cda0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
cdb0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
cdc0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
cdd0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
cde0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
cdf0: 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69  endif.  db->u1.i
ce00: 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31  sInterrupted = 1
ce10: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
ce20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61   function is exa
ce30: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73  ctly the same as
ce40: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
ce50: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65  function(), exce
ce60: 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  pt.** that it is
ce70: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20   designed to be 
ce80: 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e  called by intern
ce90: 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66  al code. The dif
cea0: 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68  ference is.** th
ceb0: 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  at if a malloc()
cec0: 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65   fails in sqlite
ced0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
cee0: 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  n(), an error co
cef0: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
cf00: 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63  d and the malloc
cf10: 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61  Failed flag clea
cf20: 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  red. .*/.int sql
cf30: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a  ite3CreateFunc(.
cf40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
cf50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
cf60: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
cf70: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
cf80: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72  c,.  void *pUser
cf90: 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78  Data,.  void (*x
cfa0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
cfb0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
cfc0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
cfd0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
cfe0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
cff0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
d000: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
d010: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
d020: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63  ontext*),.  Func
d030: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
d040: 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e  tructor.){.  Fun
d050: 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cDef *p;.  int n
d060: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72  Name;.  int extr
d070: 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72  aFlags;..  asser
d080: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d090: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
d0a0: 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74   );.  if( zFunct
d0b0: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20  ionName==0 ||.  
d0c0: 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78      (xFunc && (x
d0d0: 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29  Final || xStep))
d0e0: 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75   || .      (!xFu
d0f0: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26  nc && (xFinal &&
d100: 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20   !xStep)) ||.   
d110: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21     (!xFunc && (!
d120: 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29  xFinal && xStep)
d130: 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67  ) ||.      (nArg
d140: 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49  <-1 || nArg>SQLI
d150: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
d160: 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32  ARG) ||.      (2
d170: 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  55<(nName = sqli
d180: 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75  te3Strlen30( zFu
d190: 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b  nctionName))) ){
d1a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d1b0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
d1c0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53    }..  assert( S
d1d0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
d1e0: 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45  ANT==SQLITE_DETE
d1f0: 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65  RMINISTIC );.  e
d200: 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20  xtraFlags = enc 
d210: 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  &  SQLITE_DETERM
d220: 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26  INISTIC;.  enc &
d230: 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45  = (SQLITE_FUNC_E
d240: 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e  NCMASK|SQLITE_AN
d250: 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53  Y);.  .#ifndef S
d260: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
d270: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
d280: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
d290: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
d2a0: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
d2b0: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
d2c0: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
d2d0: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
d2e0: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
d2f0: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
d300: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
d310: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
d320: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
d330: 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ally..  **.  ** 
d340: 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73  If SQLITE_ANY is
d350: 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20   specified, add 
d360: 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
d370: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20  f the function. 
d380: 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20   ** to the hash 
d390: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
d3a0: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ( enc==SQLITE_UT
d3b0: 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d  F16 ){.    enc =
d3c0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
d3d0: 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  IVE;.  }else if(
d3e0: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59   enc==SQLITE_ANY
d3f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
d400: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d410: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
d420: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
d430: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c  rg, SQLITE_UTF8|
d440: 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20  extraFlags,.    
d450: 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20       pUserData, 
d460: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
d470: 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f  inal, pDestructo
d480: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
d490: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
d4b0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
d4c0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
d4d0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  g, SQLITE_UTF16L
d4e0: 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20  E|extraFlags,.  
d4f0: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
d500: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
d510: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
d520: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ctor);.    }.   
d530: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d540: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
d550: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
d560: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
d570: 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  F16BE;.  }.#else
d580: 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  .  enc = SQLITE_
d590: 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  UTF8;.#endif.  .
d5a0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
d5b0: 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69   existing functi
d5c0: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  on is being over
d5d0: 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65  ridden or delete
d5e0: 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61  d. If so,.  ** a
d5f0: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
d600: 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65  ive VMs, then re
d610: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
d620: 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a  . If a function.
d630: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76    ** is being ov
d640: 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64  erridden/deleted
d650: 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e   but there are n
d660: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c  o active VMs, al
d670: 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  low the.  ** ope
d680: 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e  ration to contin
d690: 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74  ue but invalidat
d6a0: 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65  e all precompile
d6b0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
d6c0: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
d6d0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
d6e0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
d6f0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
d700: 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  )enc, 0);.  if( 
d710: 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61  p && (p->funcFla
d720: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
d730: 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26  _ENCMASK)==enc &
d740: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
d750: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
d760: 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
d770: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d780: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
d790: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
d7a0: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
d7b0: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
d7c0: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
d7d0: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
d7e0: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
d7f0: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
d800: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
d810: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
d820: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d830: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
d840: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
d850: 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ts(db);.    }.  
d860: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
d870: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
d880: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
d890: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
d8a0: 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65  )enc, 1);.  asse
d8b0: 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  rt(p || db->mall
d8c0: 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28  ocFailed);.  if(
d8d0: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
d8e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d8f0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
d900: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66  older version of
d910: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
d920: 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20  th a configured 
d930: 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20  destructor is.  
d940: 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ** being replace
d950: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  d invoke the des
d960: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
d970: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63   here. */.  func
d980: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
d990: 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74  p);..  if( pDest
d9a0: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
d9b0: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b  estructor->nRef+
d9c0: 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65 73  +;.  }.  p->pDes
d9d0: 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72  tructor = pDestr
d9e0: 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63  uctor;.  p->func
d9f0: 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63  Flags = (p->func
da00: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
da10: 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65  UNC_ENCMASK) | e
da20: 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74 65 73  xtraFlags;.  tes
da30: 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c  tcase( p->funcFl
da40: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45 54  ags & SQLITE_DET
da50: 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20  ERMINISTIC );.  
da60: 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63  p->xFunc = xFunc
da70: 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78  ;.  p->xStep = x
da80: 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61  Step;.  p->xFina
da90: 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20  lize = xFinal;. 
daa0: 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20   p->pUserData = 
dab0: 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e  pUserData;.  p->
dac0: 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67  nArg = (u16)nArg
dad0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
dae0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
daf0: 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20 66  reate new user f
db00: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  unctions..*/.int
db10: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
db20: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
db30: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
db40: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
db50: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
db60: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
db70: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
db80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
db90: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
dba0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
dbb0: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
dbc0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
dbd0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
dbe0: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
dbf0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
dc00: 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  *).){.  return s
dc10: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
dc20: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46  nction_v2(db, zF
dc30: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
dc40: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
dc50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b       xFinal, 0);
dc80: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
dc90: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
dca0: 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
dcb0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
dcc0: 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41  *zFunc,.  int nA
dcd0: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
dce0: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
dcf0: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
dd00: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
dd10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
dd20: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
dd30: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
dd40: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
dd50: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
dd60: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
dd70: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
dd80: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29  void (*xDestroy)
dd90: 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e  (void *).){.  in
dda0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
ddb0: 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72  ROR;.  FuncDestr
ddc0: 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b  uctor *pArg = 0;
ddd0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
dde0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
ddf0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
de00: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
de10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
de20: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
de30: 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
de40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
de50: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
de60: 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29    if( xDestroy )
de70: 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75  {.    pArg = (Fu
de80: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73  ncDestructor *)s
de90: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
dea0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75  ro(db, sizeof(Fu
deb0: 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a  ncDestructor));.
dec0: 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b      if( !pArg ){
ded0: 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28  .      xDestroy(
dee0: 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  p);.      goto o
def0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ut;.    }.    pA
df00: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
df10: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
df20: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
df30: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
df40: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
df50: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
df60: 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  enc, p, xFunc, x
df70: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41  Step, xFinal, pA
df80: 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20  rg);.  if( pArg 
df90: 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30  && pArg->nRef==0
dfa0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dfb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
dfc0: 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29  .    xDestroy(p)
dfd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
dfe0: 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ree(db, pArg);. 
dff0: 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d   }.. out:.  rc =
e000: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e010: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
e020: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e030: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e040: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
e050: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
e060: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
e070: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e080: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
e090: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
e0a0: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
e0b0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
e0c0: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
e0d0: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
e0e0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
e0f0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
e100: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
e110: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e120: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e130: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e140: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
e150: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
e160: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
e170: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
e180: 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  nc8;..#ifdef SQL
e190: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e1a0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
e1b0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
e1c0: 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69 6f  (db) || zFunctio
e1d0: 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  nName==0 ) retur
e1e0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
e1f0: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
e200: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e210: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
e220: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
e230: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
e240: 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33  zFunc8 = sqlite3
e250: 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75  Utf16to8(db, zFu
e260: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20  nctionName, -1, 
e270: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
e280: 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  VE);.  rc = sqli
e290: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
e2a0: 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20  , zFunc8, nArg, 
e2b0: 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75  eTextRep, p, xFu
e2c0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
e2d0: 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  l,0);.  sqlite3D
e2e0: 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38  bFree(db, zFunc8
e2f0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
e300: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
e310: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
e320: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
e330: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
e340: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
e350: 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61  * Declare that a
e360: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
e370: 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  en overloaded by
e380: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
e390: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
e3a0: 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  unction already 
e3b0: 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75  exists as a regu
e3c0: 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  lar global funct
e3d0: 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ion, then.** thi
e3e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
e3f0: 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75  o-op.  If the fu
e400: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
e410: 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61  exist, then crea
e420: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20  te.** a new one 
e430: 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f  that always thro
e440: 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  ws a run-time er
e450: 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  ror.  .**.** Whe
e460: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
e470: 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69   intend to provi
e480: 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64  de an overloaded
e490: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a   function, they.
e4a0: 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74  ** should call t
e4b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d  his routine to m
e4c0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f  ake sure the glo
e4d0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  bal function exi
e4e0: 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  sts..** A global
e4f0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65   function must e
e500: 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  xist in order fo
e510: 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
e520: 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f  n to work.** pro
e530: 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  perly..*/.int sq
e540: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
e550: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
e560: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
e570: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
e580: 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74  nt nArg.){.  int
e590: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
e5a0: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
e5b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e5c0: 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53  TE_OK;..#ifdef S
e5d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e5e0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e5f0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e600: 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d  Ok(db) || zName=
e610: 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b  =0 || nArg<-2 ){
e620: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e630: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
e640: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
e650: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
e660: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
e670: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75  f( sqlite3FindFu
e680: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
e690: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , nName, nArg, S
e6a0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d  QLITE_UTF8, 0)==
e6b0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
e6c0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
e6d0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
e6e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
e710: 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69  te3InvalidFuncti
e720: 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  on, 0, 0, 0);.  
e730: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
e740: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
e750: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
e760: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
e770: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e780: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e790: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
e7a0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72  ** Register a tr
e7b0: 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ace function.  T
e7c0: 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
e7d0: 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
e7e0: 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20  stered trace.** 
e7f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
e800: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63  *.** A NULL trac
e810: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
e820: 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67   that no tracing
e830: 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
e840: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61   non-NULL.** tra
e850: 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ce is a pointer 
e860: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
e870: 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
e880: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
e890: 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  ch.** SQL statem
e8a0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ent..*/.void *sq
e8b0: 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69  lite3_trace(sqli
e8c0: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a  te3 *db, void (*
e8d0: 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f  xTrace)(void*,co
e8e0: 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64  nst char*), void
e8f0: 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20   *pArg){.  void 
e900: 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
e910: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e920: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e930: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e940: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
e950: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
e960: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
e970: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
e980: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
e990: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
e9a0: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
e9b0: 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d  pTraceArg;.  db-
e9c0: 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65  >xTrace = xTrace
e9d0: 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72  ;.  db->pTraceAr
e9e0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
e9f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ea00: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
ea10: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a  turn pOld;.}./*.
ea20: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72  ** Register a pr
ea30: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20  ofile function. 
ea40: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
ea50: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
ea60: 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f  gistered .** pro
ea70: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  file function is
ea80: 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
ea90: 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c  ** A NULL profil
eaa0: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
eab0: 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69   that no profili
eac0: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
ead0: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70   A non-NULL.** p
eae0: 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e  rofile is a poin
eaf0: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
eb00: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
eb10: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
eb20: 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53  ion of.** each S
eb30: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  QL statement tha
eb40: 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  t is run..*/.voi
eb50: 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69  d *sqlite3_profi
eb60: 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le(.  sqlite3 *d
eb70: 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f  b,.  void (*xPro
eb80: 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  file)(void*,cons
eb90: 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75  t char*,sqlite_u
eba0: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
ebb0: 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  pArg.){.  void *
ebc0: 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOld;..#ifdef SQ
ebd0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
ebe0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
ebf0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
ec00: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
ec10: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
ec20: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
ec30: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
ec40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ec50: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
ec60: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
ec70: 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62  ProfileArg;.  db
ec80: 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72  ->xProfile = xPr
ec90: 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72  ofile;.  db->pPr
eca0: 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b  ofileArg = pArg;
ecb0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ecc0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
ecd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
ece0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
ecf0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
ed00: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
ed10: 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f  er a function to
ed20: 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e   be invoked when
ed30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
ed40: 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68  ommits..** If th
ed50: 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69  e invoked functi
ed60: 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
ed70: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ero, then the co
ed80: 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a  mmit becomes a.*
ed90: 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76  * rollback..*/.v
eda0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d  oid *sqlite3_com
edb0: 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  mit_hook(.  sqli
edc0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
edd0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
ede0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
edf0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
ee00: 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  nt (*xCallback)(
ee10: 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63  void*),  /* Func
ee20: 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f  tion to invoke o
ee30: 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f  n each commit */
ee40: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee60: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
ee70: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
ee80: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69   void *pOld;..#i
ee90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
eea0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
eeb0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
eec0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
eed0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
eee0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
eef0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ef00: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
ef10: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ef20: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
ef30: 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  = db->pCommitArg
ef40: 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  ;.  db->xCommitC
ef50: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
ef60: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d  ack;.  db->pComm
ef70: 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  itArg = pArg;.  
ef80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ef90: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
efa0: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
efb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
efc0: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
efd0: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
efe0: 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64  ime a row is upd
eff0: 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65  ated,.** inserte
f000: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69  d or deleted usi
f010: 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65  ng this database
f020: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
f030: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70  void *sqlite3_up
f040: 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  date_hook(.  sql
f050: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
f060: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
f070: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
f080: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
f090: 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
f0a0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72  )(void*,int,char
f0b0: 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f   const *,char co
f0c0: 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74  nst *,sqlite_int
f0d0: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
f0e0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
f0f0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
f100: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
f110: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
f120: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f130: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
f140: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f150: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
f160: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
f170: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
f180: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f190: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
f1a0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f1b0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
f1c0: 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74  Ret = db->pUpdat
f1d0: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64  eArg;.  db->xUpd
f1e0: 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ateCallback = xC
f1f0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
f200: 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67  UpdateArg = pArg
f210: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f220: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f230: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
f240: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  t;.}../*.** Regi
f250: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
f260: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
f270: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
f280: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a  ction is rolled.
f290: 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20  ** back by this 
f2a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f2b0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
f2c0: 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
f2d0: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
f2e0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
f2f0: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
f300: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
f310: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
f320: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
f330: 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  *), /* Callback 
f340: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
f350: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
f360: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
f370: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
f380: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
f390: 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20   *pRet;..#ifdef 
f3a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f3b0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f3c0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f3d0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
f3e0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
f3f0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
f400: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
f410: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f420: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f430: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
f440: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
f450: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
f460: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
f470: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
f480: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
f490: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f4a0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
f4b0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
f4c0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
f4d0: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
f4e0: 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67  E_HOOK./*.** Reg
f4f0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
f500: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
f510: 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
f520: 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
f530: 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
f540: 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
f550: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
f560: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
f570: 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f  e3_preupdate_hoo
f580: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
f590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f5a0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
f5b0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
f5c0: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43  se */.  void(*xC
f5d0: 61 6c 6c 62 61 63 6b 29 28 20 20 20 20 20 20 20  allback)(       
f5e0: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75    /* Callback fu
f5f0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f  nction */.    vo
f600: 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
f610: 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61  ,char const*,cha
f620: 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33  r const*,sqlite3
f630: 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f 69  _int64,sqlite3_i
f640: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
f650: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
f660: 20 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c     /* First call
f670: 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f  back argument */
f680: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
f690: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f6a0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f6b0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
f6c0: 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 3b 0a  >pPreUpdateArg;.
f6d0: 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65    db->xPreUpdate
f6e0: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
f6f0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65  back;.  db->pPre
f700: 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67  UpdateArg = pArg
f710: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f720: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f730: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
f740: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
f750: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
f760: 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a  UPDATE_HOOK */..
f770: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f780: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
f790: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  e sqlite3_wal_ho
f7a0: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65  ok() callback re
f7b0: 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69  gistered by sqli
f7c0: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
f7d0: 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76  kpoint()..** Inv
f7e0: 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  oke sqlite3_wal_
f7f0: 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
f800: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
f810: 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
f820: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
f830: 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57   than sqlite3.pW
f840: 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e  alArg cast to an
f850: 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61   integer (the va
f860: 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62  lue configured b
f870: 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65  y.** wal_autoche
f880: 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a  ckpoint())..*/ .
f890: 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65  int sqlite3WalDe
f8a0: 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69  faultHook(.  voi
f8b0: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20  d *pClientData, 
f8c0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
f8d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
f8e0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
f8f0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
f900: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
f910: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
f920: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d  e */.  int nFram
f930: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
f940: 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a   Size of WAL */.
f950: 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  ){.  if( nFrame>
f960: 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  =SQLITE_PTR_TO_I
f970: 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20  NT(pClientData) 
f980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
f990: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
f9a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  );.    sqlite3_w
f9b0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  al_checkpoint(db
f9c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , zDb);.    sqli
f9d0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
f9e0: 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oc();.  }.  retu
f9f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fa00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fa10: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
fa20: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e  .** Configure an
fa30: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
fa40: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  k() callback to 
fa50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68  automatically ch
fa60: 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61  eckpoint.** a da
fa70: 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d  tabase after com
fa80: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
fa90: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ction if there a
faa0: 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20  re nFrame or.** 
fab0: 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74  more frames in t
fac0: 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73  he log file. Pas
fad0: 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e  sing zero or a n
fae0: 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73  egative value as
faf0: 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70   the.** nFrame p
fb00: 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65  arameter disable
fb10: 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  s automatic chec
fb20: 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79  kpoints entirely
fb30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
fb40: 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
fb50: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
fb60: 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78   replaces any ex
fb70: 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a  isting callback.
fb80: 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73  ** registered us
fb90: 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
fba0: 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65  hook(). Likewise
fbb0: 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20  , registering a 
fbc0: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  callback.** usin
fbd0: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
fbe0: 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68  ok() disables th
fbf0: 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  e automatic chec
fc00: 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d  kpoint mechanism
fc10: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62  .** configured b
fc20: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
fc30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
fc40: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
fc50: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
fc60: 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66  int nFrame){.#if
fc70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fc80: 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  WAL.  UNUSED_PAR
fc90: 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
fca0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
fcb0: 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69  Frame);.#else.#i
fcc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
fcd0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
fce0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
fcf0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
fd00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
fd10: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
fd20: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20  .  if( nFrame>0 
fd30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
fd40: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69  al_hook(db, sqli
fd50: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
fd60: 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  k, SQLITE_INT_TO
fd70: 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20  _PTR(nFrame));. 
fd80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
fd90: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
fda0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
fdb0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
fdc0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fdd0: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
fde0: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
fdf0: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
fe00: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69  ansaction is wri
fe10: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  tten.** into the
fe20: 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
fe30: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
fe40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
fe50: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77  .void *sqlite3_w
fe60: 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  al_hook(.  sqlit
fe70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
fe80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
fe90: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
fea0: 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20   this db handle 
feb0: 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62  */.  int(*xCallb
fec0: 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c  ack)(void *, sql
fed0: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
fee0: 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64  r*, int),.  void
fef0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ff10: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
ff20: 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63  ssed to xCallbac
ff30: 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  k() */.){.#ifnde
ff40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
ff50: 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  L.  void *pRet;.
ff60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ff70: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
ff80: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
ff90: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
ffa0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
ffb0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
ffc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ffd0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
ffe0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
fff0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
10000 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
10010 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
10020 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
10030 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
10040 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
10050 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10060 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
10070 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
10080 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
10090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
100a0 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
100b0 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
100c0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
100d0 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
100e0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
100f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
10100 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
10110 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10130 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
10140 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
10150 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
10160 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
10170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
10180 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
10190 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
101a0 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
101c0 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
101d0 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
101e0 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
10210 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
10220 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
10230 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
10240 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
10250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10260 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10290 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
102a0 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
102b0 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
102c0 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
102d0 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
102e0 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64  ckpoint */..#ifd
102f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10300 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
10310 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
10320 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
10330 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
10340 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a  E_BKPT;.#endif..
10350 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
10360 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
10370 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61  bles to -1 in ca
10380 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
10390 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c  rs. */.  if( pnL
103a0 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31  og ) *pnLog = -1
103b0 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29  ;.  if( pnCkpt )
103c0 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a   *pnCkpt = -1;..
103d0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
103e0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
103f0 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  IVE==0 );.  asse
10400 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
10410 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b  POINT_FULL==1 );
10420 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
10430 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
10440 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73  TART==2 );.  ass
10450 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
10460 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d  KPOINT_TRUNCATE=
10470 3d 33 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =3 );.  if( eMod
10480 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e<SQLITE_CHECKPO
10490 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65  INT_PASSIVE || e
104a0 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43  Mode>SQLITE_CHEC
104b0 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 20  KPOINT_TRUNCATE 
104c0 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
104d0 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31  CE-OF: R-03996-1
104e0 32 30 38 38 20 54 68 65 20 4d 20 70 61 72 61 6d  2088 The M param
104f0 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 76  eter must be a v
10500 61 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a  alid checkpoint.
10510 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a      ** mode: */.
10520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10530 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20  E_MISUSE;.  }.. 
10540 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10550 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10560 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44  .  if( zDb && zD
10570 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20  b[0] ){.    iDb 
10580 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
10590 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
105a0 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b  }.  if( iDb<0 ){
105b0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
105c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
105d0 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
105e0 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  db, SQLITE_ERROR
105f0 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
10600 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a  ase: %s", zDb);.
10610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
10620 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f  = sqlite3Checkpo
10630 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f  int(db, iDb, eMo
10640 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
10650 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
10660 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
10670 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10680 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
10690 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
106a0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
106b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
106c0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
106d0 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
106e0 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62  base zDb. If zDb
106f0 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20   is NULL, or if 
10700 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70  the buffer zDb p
10710 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74  oints.** to cont
10720 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  ains a zero-leng
10730 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61  th string, all a
10740 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
10750 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70  s are .** checkp
10760 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ointed..*/.int s
10770 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
10780 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
10790 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
107a0 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Db){.  /* EVIDEN
107b0 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32  CE-OF: R-41613-2
107c0 30 35 35 33 20 54 68 65 20 73 71 6c 69 74 65 33  0553 The sqlite3
107d0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
107e0 44 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c 65  D,X) is equivale
107f0 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74  nt to.  ** sqlit
10800 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
10810 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f  t_v2(D,X,SQLITE_
10820 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
10830 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65  VE,0,0). */.  re
10840 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  turn sqlite3_wal
10850 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
10860 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45  b,zDb,SQLITE_CHE
10870 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
10880 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  0,0);.}..#ifndef
10890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
108a0 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65  ./*.** Run a che
108b0 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62  ckpoint on datab
108c0 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73  ase iDb. This is
108d0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61   a no-op if data
108e0 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e  base iDb is.** n
108f0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ot currently ope
10900 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a  n in WAL mode..*
10910 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
10920 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
10930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
10940 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
10950 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
10960 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
10970 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20  TE_LOCKED and a 
10980 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f  checkpoint is no
10990 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20  t attempted. If 
109a0 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  .** an error occ
109b0 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e  urs while runnin
109c0 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  g the checkpoint
109d0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
109e0 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
109f0 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c  turned (i.e. SQL
10a00 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65  ITE_IOERR). Othe
10a10 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
10a20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
10a30 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  x on database ha
10a40 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62  ndle db should b
10a50 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61  e held by the ca
10a60 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a  ller. The mutex.
10a70 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
10a80 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20  th the specific 
10a90 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65  b-tree being che
10aa0 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b  ckpointed is tak
10ab0 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75  en by.** this fu
10ac0 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65  nction while the
10ad0 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72   checkpoint is r
10ae0 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  unning..**.** If
10af0 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53   iDb is passed S
10b00 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
10b10 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74  ED, then all att
10b20 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
10b30 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  are.** checkpoin
10b40 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ted. If an error
10b50 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
10b60 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  it is returned i
10b70 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20  mmediately -.** 
10b80 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  no attempt is ma
10b90 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  de to checkpoint
10ba0 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64   any remaining d
10bb0 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
10bc0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
10bd0 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  is one of SQLITE
10be0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
10bf0 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53  IVE, FULL or RES
10c00 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TART..*/.int sql
10c10 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73  ite3Checkpoint(s
10c20 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
10c30 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20  iDb, int eMode, 
10c40 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20  int *pnLog, int 
10c50 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20  *pnCkpt){.  int 
10c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
10c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10c80 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
10c90 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
10cc0 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61 63  te through attac
10cd0 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74  hed dbs */.  int
10ce0 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20   bBusy = 0;     
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d00 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42  True if SQLITE_B
10d10 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63  USY has been enc
10d20 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61  ountered */..  a
10d30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10d40 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
10d50 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
10d60 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c  ( !pnLog || *pnL
10d70 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65  og==-1 );.  asse
10d80 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a  rt( !pnCkpt || *
10d90 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20  pnCkpt==-1 );.. 
10da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
10db0 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  nDb && rc==SQLIT
10dc0 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
10dd0 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44  if( i==iDb || iD
10de0 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  b==SQLITE_MAX_AT
10df0 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20  TACHED ){.      
10e00 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
10e10 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e  eCheckpoint(db->
10e20 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64  aDb[i].pBt, eMod
10e30 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74  e, pnLog, pnCkpt
10e40 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d  );.      pnLog =
10e50 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74   0;.      pnCkpt
10e60 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
10e70 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
10e80 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73 79  ){.        bBusy
10e90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63   = 1;.        rc
10ea0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10eb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10ec0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
10ed0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73  QLITE_OK && bBus
10ee0 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  y) ? SQLITE_BUSY
10ef0 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20   : rc;.}.#endif 
10f00 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
10f10 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  AL */../*.** Thi
10f20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
10f30 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d  ns true if main-
10f40 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  memory should be
10f50 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
10f60 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
10f70 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65  file for transie
10f80 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61  nt pager files a
10f90 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  nd statement jou
10fa0 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61  rnals..** The va
10fb0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70  lue returned dep
10fc0 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
10fd0 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74  e of db->temp_st
10fe0 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20  ore (runtime.** 
10ff0 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74  parameter) and t
11000 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  he compile time 
11010 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f  value of SQLITE_
11020 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a  TEMP_STORE. The.
11030 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  ** following tab
11040 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
11050 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
11060 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20  tween these two 
11070 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68  values.** and th
11080 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  is functions ret
11090 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  urn value..**.**
110a0 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53     SQLITE_TEMP_S
110b0 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d  TORE     db->tem
110c0 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61  p_store     Loca
110d0 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72  tion of temporar
110e0 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  y database.**   
110f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11100 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
11110 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
11120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11130 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
11160 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
11170 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
11180 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
11190 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
111a0 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
111b0 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
111c0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
111d0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
111e0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
111f0 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
11200 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
11210 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
11230 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
11240 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
11280 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
112b0 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
112c0 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32  return 1).**   2
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
112f0 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
11300 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
11310 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
11320 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
11330 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
11340 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
11350 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65  */.int sqlite3Te
11360 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74  mpInMemory(const
11370 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23   sqlite3 *db){.#
11380 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
11390 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e  TORE==1.  return
113a0 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
113b0 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e==2 );.#endif.#
113c0 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
113d0 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e  TORE==2.  return
113e0 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
113f0 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e!=1 );.#endif.#
11400 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
11410 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e  TORE==3.  return
11420 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   1;.#endif.#if S
11430 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11440 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d  <1 || SQLITE_TEM
11450 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75  P_STORE>3.  retu
11460 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
11470 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46  /*.** Return UTF
11480 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  -8 encoded Engli
11490 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
114a0 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
114b0 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
114c0 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ror..*/.const ch
114d0 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  ar *sqlite3_errm
114e0 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  sg(sqlite3 *db){
114f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11500 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ;.  if( !db ){. 
11510 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
11520 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
11530 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  OMEM);.  }.  if(
11540 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
11550 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
11560 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
11570 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
11580 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29  ITE_MISUSE_BKPT)
11590 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
115a0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
115b0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
115c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
115d0 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
115e0 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
115f0 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OMEM);.  }else{.
11600 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
11610 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20  ->pErr==0 );.   
11620 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69   z = (char*)sqli
11630 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64  te3_value_text(d
11640 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73  b->pErr);.    as
11650 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
11660 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
11670 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
11680 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
11690 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b  tr(db->errCode);
116a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
116b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
116c0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
116d0 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
116e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
116f0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
11700 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
11710 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
11720 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
11730 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
11740 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
11750 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
11760 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
11770 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
11780 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74  ic const u16 out
11790 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20  OfMem[] = {.    
117a0 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
117b0 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20   ', 'o', 'f', ' 
117c0 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27  ', 'm', 'e', 'm'
117d0 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'o', 'r', 'y',
117e0 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63   0.  };.  static
117f0 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73   const u16 misus
11800 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c  e[] = {.    'l',
11810 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20   'i', 'b', 'r', 
11820 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27  'a', 'r', 'y', '
11830 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f   ', .    'r', 'o
11840 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27  ', 'u', 't', 'i'
11850 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c  , 'n', 'e', ' ',
11860 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20   .    'c', 'a', 
11870 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27  'l', 'l', 'e', '
11880 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  d', ' ', .    'o
11890 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
118a0 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c  , .    'o', 'f',
118b0 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20   ' ', .    's', 
118c0 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27  'e', 'q', 'u', '
118d0 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65  e', 'n', 'c', 'e
118e0 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e  ', 0.  };..  con
118f0 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66  st void *z;.  if
11900 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
11910 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  urn (void *)outO
11920 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fMem;.  }.  if( 
11930 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
11940 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
11950 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
11960 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20  oid *)misuse;.  
11970 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
11980 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
11990 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
119a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
119b0 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75    z = (void *)ou
119c0 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b  tOfMem;.  }else{
119d0 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
119e0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
119f0 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28  ->pErr);.    if(
11a00 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   z==0 ){.      s
11a10 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
11a20 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f  sg(db, db->errCo
11a30 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  de, sqlite3ErrSt
11a40 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b  r(db->errCode));
11a50 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
11a60 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
11a70 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d  db->pErr);.    }
11a80 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  .    /* A malloc
11a90 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c  () may have fail
11aa0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
11ab0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ll to sqlite3_va
11ac0 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20  lue_text16().   
11ad0 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68   ** above. If th
11ae0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
11af0 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c  then the db->mal
11b00 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e  locFailed flag n
11b10 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
11b20 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
11b30 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74   returning. Do t
11b40 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  his directly, in
11b50 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20  stead of via.   
11b60 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78   ** sqlite3ApiEx
11b70 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73  it(), to avoid s
11b80 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  etting the datab
11b90 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  ase handle error
11ba0 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f   message..    */
11bb0 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
11bc0 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  ailed = 0;.  }. 
11bd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11be0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
11bf0 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
11c00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11c10 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
11c20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11c30 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
11c40 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  r code generated
11c50 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f   by an SQLite ro
11c60 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69  utine. If NULL i
11c70 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74  s.** passed to t
11c80 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65  his function, we
11c90 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63   assume a malloc
11ca0 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67  () failed during
11cb0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
11cc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
11cd0 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
11ce0 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
11cf0 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
11d00 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
11d10 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11d20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
11d30 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
11d40 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
11d50 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
11d60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11d70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
11d80 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
11d90 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
11da0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
11db0 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
11dc0 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
11dd0 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
11de0 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
11df0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
11e00 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
11e10 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
11e20 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
11e30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
11e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11e50 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
11e60 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a  db->errCode;.}..
11e70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
11e80 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
11e90 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
11ea0 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
11eb0 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
11ec0 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74  ent.  For now, t
11ed0 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73  his simply calls
11ee0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71   the internal sq
11ef0 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a  lite3ErrStr().**
11f00 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f   function..*/.co
11f10 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
11f20 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63 29  3_errstr(int rc)
11f30 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
11f40 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a  e3ErrStr(rc);.}.
11f50 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
11f60 65 20 61 6c 6c 20 63 61 63 68 65 64 20 4b 65 79  e all cached Key
11f70 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 66 6f 72  Info objects for
11f80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11f90 74 69 6f 6e 20 22 64 62 22 0a 2a 2f 0a 73 74 61  tion "db".*/.sta
11fa0 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
11fb0 61 74 65 43 61 63 68 65 64 4b 65 79 49 6e 66 6f  ateCachedKeyInfo
11fc0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
11fd0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ff0 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
12000 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
12030 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
12040 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
12050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12060 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
12070 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
12080 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
12090 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
120a0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
120b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
120c0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 2f 2a 20 45 61 63 68 20 69 6e 64 65 78 20 2a 2f  /* Each index */
120f0 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70  ..  for(iDb=0, p
12100 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c  Db=db->aDb; iDb<
12110 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20  db->nDb; iDb++, 
12120 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  pDb++){.    if( 
12130 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 20 63 6f  pDb->pBt==0 ) co
12140 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69  ntinue;.    sqli
12150 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 44  te3BtreeEnter(pD
12160 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 66 6f 72  b->pBt);.    for
12170 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
12180 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
12190 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
121a0 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
121b0 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
121c0 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
121d0 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
121e0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
121f0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
12200 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
12210 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
12220 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 26  pIdx->pKeyInfo &
12230 26 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f  & pIdx->pKeyInfo
12240 2d 3e 64 62 3d 3d 64 62 20 29 7b 0a 20 20 20 20  ->db==db ){.    
12250 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
12260 49 6e 66 6f 55 6e 72 65 66 28 70 49 64 78 2d 3e  InfoUnref(pIdx->
12270 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
12280 20 20 20 20 20 70 49 64 78 2d 3e 70 4b 65 79 49       pIdx->pKeyI
12290 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nfo = 0;.       
122a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
122b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
122c0 65 4c 65 61 76 65 28 70 44 62 2d 3e 70 42 74 29  eLeave(pDb->pBt)
122d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
122e0 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c  reate a new coll
122f0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66  ating function f
12300 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22  or database "db"
12310 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a  .  The name is z
12320 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Name.** and the 
12330 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e  encoding is enc.
12340 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
12350 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a  reateCollation(.
12360 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20    sqlite3* db,. 
12370 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
12380 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20  me, .  u8 enc,. 
12390 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
123a0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
123b0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
123c0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
123d0 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
123e0 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
123f0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
12400 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20    int enc2;.  . 
12410 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12420 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
12430 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
12440 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
12450 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
12460 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
12470 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
12480 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
12490 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
124a0 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
124b0 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
124c0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
124d0 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
124e0 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
124f0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
12500 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
12510 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  c;.  testcase( e
12520 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
12530 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
12540 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
12550 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20  F16_ALIGNED );. 
12560 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54   if( enc2==SQLIT
12570 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d  E_UTF16 || enc2=
12580 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
12590 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63  IGNED ){.    enc
125a0 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
125b0 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
125c0 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54  ( enc2<SQLITE_UT
125d0 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54  F8 || enc2>SQLIT
125e0 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
125f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
12600 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
12610 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
12620 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f  his call is remo
12630 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e  ving or replacin
12640 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f  g an existing co
12650 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65  llation .  ** se
12660 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61  quence. If so, a
12670 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
12680 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20  ive VMs, return 
12690 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20  busy. If there. 
126a0 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76   ** are no activ
126b0 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74  e VMs, invalidat
126c0 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c  e any pre-compil
126d0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
126e0 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   */.  pColl = sq
126f0 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
12700 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
12710 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
12720 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
12730 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20  xCmp ){.    if( 
12740 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
12750 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12760 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
12770 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
12780 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
12790 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
127a0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
127b0 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  ce due to active
127c0 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
127d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
127e0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
127f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
12800 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
12810 74 73 28 64 62 29 3b 0a 20 20 20 20 69 6e 76 61  ts(db);.    inva
12820 6c 69 64 61 74 65 43 61 63 68 65 64 4b 65 79 49  lidateCachedKeyI
12830 6e 66 6f 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nfo(db);..    /*
12840 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
12850 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
12860 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
12870 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
12880 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
12890 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
128a0 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
128b0 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
128c0 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
128d0 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
128e0 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
128f0 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
12900 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
12910 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
12920 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
12930 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
12940 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
12950 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
12960 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
12970 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
12980 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
12990 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
129a0 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
129b0 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
129c0 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
129d0 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
129e0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
129f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
12a00 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
12a10 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
12a20 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
12a30 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
12a40 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
12a50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
12a60 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
12a70 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
12a80 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
12a90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
12aa0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
12ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12ac0 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
12ad0 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
12ae0 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
12af0 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
12b00 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
12b10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12b20 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
12b30 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
12b40 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
12b50 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
12b60 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
12b70 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
12b80 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
12b90 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
12ba0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
12bb0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
12bc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12bd0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
12be0 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73  is array defines
12bf0 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
12c00 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75  ds on limit valu
12c10 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74  es.  The.** init
12c20 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20  ializer must be 
12c30 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74  kept in sync wit
12c40 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  h the SQLITE_LIM
12c50 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73  IT_*.** #defines
12c60 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a   in sqlite3.h..*
12c70 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
12c80 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20  nt aHardLimit[] 
12c90 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  = {.  SQLITE_MAX
12ca0 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
12cb0 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
12cc0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
12cd0 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f  OLUMN,.  SQLITE_
12ce0 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a  MAX_EXPR_DEPTH,.
12cf0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d    SQLITE_MAX_COM
12d00 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20  POUND_SELECT,.  
12d10 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
12d20 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  OP,.  SQLITE_MAX
12d30 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20  _FUNCTION_ARG,. 
12d40 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
12d50 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  CHED,.  SQLITE_M
12d60 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
12d70 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
12d80 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
12d90 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d  MBER,      /* IM
12da0 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32  P: R-38091-32352
12db0 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58   */.  SQLITE_MAX
12dc0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a  _TRIGGER_DEPTH,.
12dd0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52    SQLITE_MAX_WOR
12de0 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a  KER_THREADS,.};.
12df0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
12e00 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
12e10 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
12e20 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
12e30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12e40 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
12e50 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
12e60 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
12e70 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
12e80 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12e90 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
12ea0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
12eb0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
12ec0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
12ed0 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
12ee0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
12ef0 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
12f00 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
12f10 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
12f20 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
12f30 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
12f40 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
12f50 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12f60 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
12f70 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
12f80 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
12f90 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
12fa0 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
12fb0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
12fc0 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
12fd0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
12fe0 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
12ff0 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
13000 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13010 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
13020 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
13030 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30  UNCTION_ARG>1000
13040 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13050 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
13060 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
13070 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64   0 and 1000.#end
13080 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13090 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
130a0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
130b0 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20  HED>125.# error 
130c0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
130d0 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77  HED must be betw
130e0 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65  een 0 and 125.#e
130f0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13100 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
13110 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f  _LENGTH<1.# erro
13120 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  r SQLITE_MAX_LIK
13130 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
13140 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13150 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
13160 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
13170 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53  >32767.# error S
13180 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
13190 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64   must not exceed
131a0 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69   32767.#endif.#i
131b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  f SQLITE_MAX_TRI
131c0 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65  GGER_DEPTH<1.# e
131d0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
131e0 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75  TRIGGER_DEPTH mu
131f0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
13200 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13210 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
13220 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54  READS<0 || SQLIT
13230 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13240 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20  EADS>50.# error 
13250 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
13260 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62  R_THREADS must b
13270 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
13280 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  50.#endif.../*.*
13290 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
132a0 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
132b0 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
132c0 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
132d0 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
132e0 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
132f0 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
13300 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
13310 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
13320 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
13330 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
13340 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
13350 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
13360 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
13370 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
13380 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
13390 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
133a0 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
133b0 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
133c0 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
133d0 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
133e0 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
133f0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
13400 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
13410 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
13420 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  mit;..#ifdef SQL
13430 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
13440 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
13450 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
13460 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
13470 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
13480 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
13490 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
134a0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
134b0 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
134c0 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
134d0 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
134e0 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
134f0 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
13500 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
13510 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
13520 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
13530 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
13540 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
13550 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
13560 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
13570 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
13580 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
13590 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
135a0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
135b0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
135c0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
135d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
135e0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
135f0 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
13600 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
13610 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
13620 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13630 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
13640 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
13650 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
13660 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13670 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
13680 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
13690 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
136a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
136b0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
136c0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
136d0 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
136e0 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
136f0 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
13700 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13710 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
13720 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
13730 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
13740 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13750 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
13760 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
13770 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
13780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13790 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
137a0 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
137b0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
137c0 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
137d0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
137e0 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
137f0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13830 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
13840 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
13850 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13860 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13870 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
13880 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
13890 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
138a0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
138b0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
138c0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
138d0 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
138e0 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
138f0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
13900 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
13910 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
13920 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  ]==SQLITE_MAX_WO
13930 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a  RKER_THREADS );.
13940 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
13950 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
13960 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e  READS==(SQLITE_N
13970 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
13980 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
13990 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
139a0 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
139b0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
139c0 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
139d0 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
139e0 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
139f0 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
13a00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
13a10 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
13a20 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
13a30 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
13a40 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
13a50 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
13a60 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
13a70 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
13a80 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
13a90 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
13aa0 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
13ab0 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
13ac0 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ae0 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
13af0 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
13b00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
13b10 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
13b20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
13b30 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
13b40 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
13b50 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
13b60 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
13b70 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
13b80 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
13b90 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
13ba0 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
13bb0 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
13bc0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
13bd0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
13be0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
13bf0 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
13c00 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
13c10 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
13c20 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
13c30 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
13c40 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
13c50 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
13c60 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
13c70 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
13c80 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
13c90 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
13ca0 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
13cb0 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
13cc0 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
13cd0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
13ce0 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
13cf0 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
13d00 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
13d10 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
13d20 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
13d30 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
13d40 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
13d50 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
13d60 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
13d70 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
13d80 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
13d90 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
13da0 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
13db0 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
13dc0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
13dd0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
13de0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
13df0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
13e00 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
13e10 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
13e20 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
13e30 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
13e40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13e50 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
13e60 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
13e70 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
13e80 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
13e90 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
13ea0 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
13eb0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
13ec0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
13ed0 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
13ee0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
13ef0 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
13f00 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
13f10 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
13f20 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
13f30 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
13f40 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
13f50 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
13f60 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
13f70 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
13f80 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
13f90 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
13fa0 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
13fb0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
13fc0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
13fd0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
13fe0 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
13ff0 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
14000 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
14010 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
14020 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
14030 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
14040 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
14050 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
14060 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
14070 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
14080 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
140a0 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
140b0 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
140c0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
140d0 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
140e0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
140f0 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
14100 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
14110 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
14120 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
14130 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
14140 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
14170 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
14180 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
14190 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
141a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
141b0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
141c0 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
141d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
141e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
141f0 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
14200 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
14210 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
14220 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
14230 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
14240 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
14250 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
14260 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
14270 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
14280 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
14290 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
142a0 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20  PEN_URI)        
142b0 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
142c0 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20  8725-32206 */.  
142d0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
142e0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
142f0 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d  .bOpenUri) /* IM
14300 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38  P: R-51689-46548
14310 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d   */.   && nUri>=
14320 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69  5 && memcmp(zUri
14330 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30  , "file:", 5)==0
14340 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34   /* IMP: R-57884
14350 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20  -37496 */.  ){. 
14360 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20     char *zOpt;. 
14370 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20     int eState;  
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65   /* Parser state
143a0 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52   when parsing UR
143b0 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e  I */.    int iIn
143c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
143d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
143e0 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
143f0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  */.    int iOut 
14400 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14410 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
14420 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
14430 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
14440 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20  = nUri+2;       
14450 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
14460 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
14470 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  e */..    /* Mak
14480 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54  e sure the SQLIT
14490 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
144a0 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
144b0 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f  te to the VFS xO
144c0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68  pen .    ** meth
144d0 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61  od that there ma
144e0 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d  y be extra param
144f0 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eters following 
14500 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20  the file-name.  
14510 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  */.    flags |= 
14520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
14530 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b  ..    for(iIn=0;
14540 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b   iIn<nUri; iIn++
14550 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69  ) nByte += (zUri
14560 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20  [iIn]=='&');.   
14570 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
14580 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
14590 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
145a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
145b0 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d  OMEM;..    iIn =
145c0 20 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   5;.#ifndef SQLI
145d0 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54  TE_ALLOW_URI_AUT
145e0 48 4f 52 49 54 59 0a 20 20 20 20 2f 2a 20 44 69  HORITY.    /* Di
145f0 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65  scard the scheme
14600 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73   and authority s
14610 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55  egments of the U
14620 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  RI. */.    if( z
14630 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a  Uri[5]=='/' && z
14640 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20  Uri[6]=='/' ){. 
14650 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
14660 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
14670 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
14680 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='/' ) iIn++;.
14690 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37        if( iIn!=7
146a0 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20   && (iIn!=16 || 
146b0 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73  memcmp("localhos
146c0 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29  t", &zUri[7], 9)
146d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  ) ){.        *pz
146e0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
146f0 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
14700 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a  d uri authority:
14710 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20   %.*s", .       
14720 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72       iIn-7, &zUr
14730 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  i[7]);.        r
14740 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
14750 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
14760 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
14770 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
14780 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  if..    /* Copy 
14790 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
147a0 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d   any query param
147b0 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a  eters into the z
147c0 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20  File buffer. .  
147d0 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20    ** Decode %HH 
147e0 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f  escape codes alo
147f0 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20  ng the way. .   
14800 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69   **.    ** Withi
14810 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72  n this loop, var
14820 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79  iable eState may
14830 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20   be set to 0, 1 
14840 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a  or 2, depending.
14850 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61      ** on the pa
14860 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41  rsing context. A
14870 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
14880 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61  *.    **   0: Pa
14890 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e  rsing file-name.
148a0 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72  .    **   1: Par
148b0 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f  sing name sectio
148c0 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
148d0 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
148e0 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50  r..    **   2: P
148f0 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63  arsing value sec
14900 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
14910 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
14920 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eter..    */.   
14930 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20   eState = 0;.   
14940 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
14950 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
14960 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='#' ){.      iI
14970 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  n++;.      if( c
14980 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26  =='%' .       &&
14990 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
149a0 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20  (zUri[iIn]) .   
149b0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
149c0 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b  xdigit(zUri[iIn+
149d0 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  1]) .      ){.  
149e0 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20        int octet 
149f0 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49  = (sqlite3HexToI
14a00 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20  nt(zUri[iIn++]) 
14a10 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f  << 4);.        o
14a20 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48  ctet += sqlite3H
14a30 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
14a40 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  ++]);..        a
14a50 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20  ssert( octet>=0 
14a60 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a  && octet<256 );.
14a70 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65          if( octe
14a80 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
14a90 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14aa0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22   is taken when "
14ab0 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74  %00" appears wit
14ac0 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20  hin the URI. In 
14ad0 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
14ae0 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65  * case we ignore
14af0 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65   all text in the
14b00 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
14b10 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a  e path, name or.
14b20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
14b30 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ue currently bei
14b40 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67  ng parsed. So ig
14b50 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  nore the current
14b60 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20   character.     
14b70 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70       ** and skip
14b80 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22   to the next "?"
14b90 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73  , "=" or "&", as
14ba0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f   appropriate. */
14bb0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
14bc0 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
14bd0 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a  )!=0 && c!='#' .
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
14bf0 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63   (eState!=0 || c
14c00 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20  !='?').         
14c10 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
14c20 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26  =1 || (c!='=' &&
14c30 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20   c!='&')).      
14c40 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
14c50 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29  te!=2 || c!='&')
14c60 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
14c70 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b            iIn++;
14c80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14c90 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14cb0 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20     c = octet;.  
14cc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
14cd0 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27  tate==1 && (c=='
14ce0 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b  &' || c=='=') ){
14cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
14d00 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b  le[iOut-1]==0 ){
14d10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
14d20 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61   empty option na
14d30 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20  me. Ignore this 
14d40 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65  option altogethe
14d50 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
14d60 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
14d70 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
14d80 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31  #' && zUri[iIn-1
14d90 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='&' ) iIn++;.
14da0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
14db0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
14dc0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27        if( c=='&'
14dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
14de0 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
14df0 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0';.        }els
14e00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  e{.          eSt
14e10 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
14e20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30   }.        c = 0
14e30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
14e40 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20  ( (eState==0 && 
14e50 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61  c=='?') || (eSta
14e60 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29  te==2 && c=='&')
14e70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
14e80 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  0;.        eStat
14e90 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
14ea0 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
14eb0 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
14ec0 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20    if( eState==1 
14ed0 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20  ) zFile[iOut++] 
14ee0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
14ef0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
14f00 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
14f10 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  ++] = '\0';..   
14f20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
14f30 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69  re were any opti
14f40 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68  ons specified th
14f50 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74  at should be int
14f60 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a  erpreted .    **
14f70 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74   here. Options t
14f80 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
14f90 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ted here include
14fa0 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65   "vfs" and those
14fb0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72   that.    ** cor
14fc0 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73  respond to flags
14fd0 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
14fe0 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  sed to the sqlit
14ff0 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20  e3_open_v2().   
15000 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20   ** method. */. 
15010 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65     zOpt = &zFile
15020 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
15030 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20  (zFile)+1];.    
15040 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29  while( zOpt[0] )
15050 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74  {.      int nOpt
15060 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15070 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20  30(zOpt);.      
15080 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f  char *zVal = &zO
15090 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20  pt[nOpt+1];.    
150a0 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
150b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61  ite3Strlen30(zVa
150c0 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  l);..      if( n
150d0 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  Opt==3 && memcmp
150e0 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29  ("vfs", zOpt, 3)
150f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
15100 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20  Vfs = zVal;.    
15110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15120 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
15130 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
15140 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
15150 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a        int mode;.
15160 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65          } *aMode
15170 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
15180 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20  ar *zModeType = 
15190 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d  0;.        int m
151a0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
151b0 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a   int limit = 0;.
151c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
151d0 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==5 && memcmp("
151e0 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29  cache", zOpt, 5)
151f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15200 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
15210 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f  penMode aCacheMo
15220 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
15230 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c       { "shared",
15240 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48    SQLITE_OPEN_SH
15250 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
15260 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76           { "priv
15270 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ate", SQLITE_OPE
15280 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
15290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
152a0 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
152b0 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
152c0 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
152d0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51  N_SHAREDCACHE|SQ
152e0 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
152f0 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20  ECACHE;.        
15300 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65    aMode = aCache
15310 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
15320 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20  limit = mask;.  
15330 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
15340 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20  e = "cache";.   
15350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15360 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65  f( nOpt==4 && me
15370 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70  mcmp("mode", zOp
15380 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 4)==0 ){.    
15390 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
153a0 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70  uct OpenMode aOp
153b0 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  enMode[] = {.   
153c0 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c           { "ro",
153d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
153e0 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
153f0 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53        { "rw",  S
15400 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
15410 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20  RITE }, .       
15420 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51       { "rwc", SQ
15430 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
15440 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
15450 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
15460 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72          { "memor
15470 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  y", SQLITE_OPEN_
15480 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20  MEMORY },.      
15490 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
154a0 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
154b0 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
154c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
154d0 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY | SQLITE_OPEN
154e0 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
15500 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
15510 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
15520 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20  _MEMORY;.       
15530 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e     aMode = aOpen
15540 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
15550 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66  limit = mask & f
15560 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
15570 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63  zModeType = "acc
15580 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ess";.        }.
15590 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f  .        if( aMo
155a0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
155b0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
155c0 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20   int mode = 0;. 
155d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
155e0 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b  ; aMode[i].z; i+
155f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
15600 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
15610 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20  aMode[i].z;.    
15620 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c          if( nVal
15630 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
15640 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  0(z) && 0==memcm
15650 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29  p(zVal, z, nVal)
15660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15670 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69    mode = aMode[i
15680 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].mode;.        
15690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
156a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
156b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
156c0 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a   if( mode==0 ){.
156d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
156e0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
156f0 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
15700 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a   %s mode: %s", z
15710 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
15720 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
15730 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
15740 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
15750 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
15760 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15770 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20        if( (mode 
15780 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
15790 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a  EMORY)>limit ){.
157a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
157b0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
157c0 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
157d0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
157e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15800 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
15810 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
15820 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15830 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
15840 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
15850 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
15860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15870 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
15880 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
15890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
158a0 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
158b0 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
158c0 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
158d0 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
158e0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b  te3_malloc(nUri+
158f0 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  2);.    if( !zFi
15900 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
15910 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
15920 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69  mcpy(zFile, zUri
15930 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69  , nUri);.    zFi
15940 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b  le[nUri] = '\0';
15950 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b  .    zFile[nUri+
15960 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  1] = '\0';.    f
15970 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
15980 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20  OPEN_URI;.  }.. 
15990 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65   *ppVfs = sqlite
159a0 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
159b0 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d  ;.  if( *ppVfs==
159c0 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  0 ){.    *pzErrM
159d0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
159e0 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66  intf("no such vf
159f0 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20  s: %s", zVfs);. 
15a00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
15a10 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65  RROR;.  }. parse
15a20 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20  _uri_out:.  if( 
15a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15a40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15a50 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46  e(zFile);.    zF
15a60 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  ile = 0;.  }.  *
15a70 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  pFlags = flags;.
15a80 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c    *pzFile = zFil
15a90 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
15aa0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
15ab0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
15ac0 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
15ad0 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
15ae0 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
15af0 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
15b00 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
15b10 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
15b20 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
15b30 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
15b40 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
15b50 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
15b60 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
15b70 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
15b80 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
15b90 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
15ba0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
15bb0 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
15bc0 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
15bd0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
15be0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
15bf0 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65  flags,    /* Ope
15c00 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
15c10 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15c20 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
15c30 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
15c40 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
15c50 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c70 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  Store allocated 
15c80 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
15c90 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15cc0 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  */.  int isThrea
15cd0 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20  dsafe;          
15ce0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
15cf0 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e   threadsafe conn
15d00 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  ections */.  cha
15d10 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20  r *zOpen = 0;   
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d30 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
15d40 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72  t to pass to Btr
15d50 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68  eeOpen() */.  ch
15d60 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d80 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
15d90 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65  rom sqlite3Parse
15da0 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66  Uri() */..#ifdef
15db0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
15dc0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70  PI_ARMOR.  if( p
15dd0 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pDb==0 ) return 
15de0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
15df0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70  PT;.#endif.  *pp
15e00 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
15e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
15e20 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
15e30 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
15e40 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
15e50 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a  urn rc;.#endif..
15e60 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    /* Only allow 
15e70 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  sensible combina
15e80 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e  tions of bits in
15e90 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   the flags argum
15ea0 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f  ent.  .  ** Thro
15eb0 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  w an error if an
15ec0 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62  y non-sense comb
15ed0 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  ination is used.
15ee0 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20    If we.  ** do 
15ef0 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61  not block illega
15f00 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68  l combinations h
15f10 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72  ere, it could tr
15f20 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72  igger.  ** asser
15f30 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
15f40 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e  n deeper layers.
15f50 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69    Sensible combi
15f60 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65  nations.  ** are
15f70 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20  :.  **.  **  1: 
15f80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15f90 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20  DONLY.  **  2:  
15fa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15fb0 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20  WRITE.  **  6:  
15fc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15fd0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
15fe0 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a  PEN_CREATE.  */.
15ff0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
16000 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
16010 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73  == 0x01 );.  ass
16020 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
16030 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78  _READWRITE == 0x
16040 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  02 );.  assert( 
16050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16060 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b  TE    == 0x04 );
16070 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
16080 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
16090 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59  2 ); /* READONLY
160a0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
160b0 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
160c0 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x04 ); /* READW
160d0 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61  RITE */.  testca
160e0 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
160f0 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52  ))==0x40 ); /* R
16100 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
16110 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c  E */.  if( ((1<<
16120 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34  (flags&7)) & 0x4
16130 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  6)==0 ){.    ret
16140 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
16150 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a  E_BKPT;  /* IMP:
16160 20 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a   R-65497-44594 *
16170 2f 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c  /.  }..  if( sql
16180 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16190 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29  .bCoreMutex==0 )
161a0 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
161b0 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
161c0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
161d0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
161e0 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
161f0 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
16200 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
16210 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
16220 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
16230 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65  adsafe = 1;.  }e
16240 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61  lse{.    isThrea
16250 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47  dsafe = sqlite3G
16260 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
16270 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66  lMutex;.  }.  if
16280 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
16290 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
162a0 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  HE ){.    flags 
162b0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
162c0 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
162d0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
162e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
162f0 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
16300 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
16310 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
16320 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
16330 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75  /* Remove harmfu
16340 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20  l bits from the 
16350 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
16360 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
16370 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
16380 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45  X and SQLITE_OPE
16390 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67  N_FULLMUTEX flag
163a0 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c  s were.  ** deal
163b0 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72  t with in the pr
163c0 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63  evious code bloc
163d0 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73  k.  Besides thes
163e0 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a  e, the only.  **
163f0 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61   valid input fla
16400 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f  gs for sqlite3_o
16410 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c  pen_v2() are SQL
16420 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16430 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  Y,.  ** SQLITE_O
16440 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53  PEN_READWRITE, S
16450 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16460 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  E, SQLITE_OPEN_S
16470 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a  HAREDCACHE,.  **
16480 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
16490 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73  VATECACHE, and s
164a0 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74  ome reserved bit
164b0 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73  s.  Silently mas
164c0 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f  k.  ** off all o
164d0 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f  ther flags..  */
164e0 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
164f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
16500 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
16510 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16520 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
16530 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
16540 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
16550 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20  IN_DB |.        
16560 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16570 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20  EN_TEMP_DB | .  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16590 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
165a0 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  NT_DB | .       
165b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
165c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
165d0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
165e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
165f0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  EMP_JOURNAL | . 
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16610 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
16620 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
16630 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16640 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
16650 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L |.            
16660 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e     SQLITE_OPEN_N
16670 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  OMUTEX |.       
16680 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16690 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a  PEN_FULLMUTEX |.
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
166b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
166c0 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a              );..
166d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
166e0 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74  e sqlite data st
166f0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20  ructure */.  db 
16700 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
16710 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69  ero( sizeof(sqli
16720 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62  te3) );.  if( db
16730 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64  ==0 ) goto opend
16740 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54  b_out;.  if( isT
16750 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20  hreadsafe ){.   
16760 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c   db->mutex = sql
16770 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
16780 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
16790 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  RSIVE);.    if( 
167a0 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  db->mutex==0 ){.
167b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
167c0 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62  ee(db);.      db
167d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
167e0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20   opendb_out;.   
167f0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
16800 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16810 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
16820 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20  rrMask = 0xff;. 
16830 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20   db->nDb = 2;.  
16840 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
16850 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
16860 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
16870 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73  DbStatic;..  ass
16880 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
16890 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
168a0 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
168b0 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
168c0 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
168d0 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
168e0 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69  t));.  db->aLimi
168f0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
16900 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d  ORKER_THREADS] =
16910 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16920 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a  WORKER_THREADS;.
16930 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
16940 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
16950 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
16960 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c  db->szMmap = sql
16970 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16980 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e  .szMmap;.  db->n
16990 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
169a0 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65  .  db->nMaxSorte
169b0 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46  rMmap = 0x7FFFFF
169c0 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  FF;.  db->flags 
169d0 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
169e0 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
169f0 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c  _EnableTrigger |
16a00 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
16a10 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ll.#if !defined(
16a20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
16a30 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20  UTOMATIC_INDEX) 
16a40 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  || SQLITE_DEFAUL
16a50 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
16a60 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X.              
16a70 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f     | SQLITE_Auto
16a80 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66  Index.#endif.#if
16a90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16aa0 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20  FILE_FORMAT<4.  
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16ac0 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
16ad0 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66  leFmt.#endif.#if
16ae0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16af0 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
16b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16b10 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45    | SQLITE_LoadE
16b20 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a  xtension.#endif.
16b30 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
16b40 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49  LT_RECURSIVE_TRI
16b50 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20  GGERS.          
16b60 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
16b70 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64  RecTriggers.#end
16b80 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
16b90 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
16ba0 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53  REIGN_KEYS) && S
16bb0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
16bc0 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20  REIGN_KEYS.     
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16be0 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
16bf0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a  .#endif.      ;.
16c00 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
16c10 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
16c20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16c30 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
16c40 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  LE.  sqlite3Hash
16c50 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Init(&db->aModul
16c60 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
16c70 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74   Add the default
16c80 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16c90 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41  nce BINARY. BINA
16ca0 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74  RY works for bot
16cb0 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64  h UTF-8.  ** and
16cc0 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20   UTF-16, so add 
16cd0 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61  a version for ea
16ce0 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20  ch to avoid any 
16cf0 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a  unnecessary.  **
16d00 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68   conversions. Th
16d10 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61  e only error tha
16d20 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65  t can occur here
16d30 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   is a malloc() f
16d40 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ailure..  **.  *
16d50 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
16d60 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c  -52786-44878 SQL
16d70 69 74 65 20 64 65 66 69 6e 65 73 20 74 68 72 65  ite defines thre
16d80 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61  e built-in colla
16d90 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ting.  ** functi
16da0 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ons:.  */.  crea
16db0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
16dc0 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
16dd0 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
16de0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
16df0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
16e00 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
16e10 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
16e20 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
16e30 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
16e40 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
16e50 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
16e60 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
16e70 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
16e80 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45  tion(db, "NOCASE
16e90 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
16ea0 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  0, nocaseCollati
16eb0 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  ngFunc, 0);.  cr
16ec0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
16ed0 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54  , "RTRIM", SQLIT
16ee0 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31  E_UTF8, (void*)1
16ef0 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
16f00 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
16f10 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
16f20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
16f30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45  ;.  }.  /* EVIDE
16f40 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d  NCE-OF: R-08308-
16f50 31 37 32 32 34 20 54 68 65 20 64 65 66 61 75 6c  17224 The defaul
16f60 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
16f70 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a  tion for all.  *
16f80 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42 49 4e  * strings is BIN
16f90 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ARY. .  */.  db-
16fa0 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
16fb0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
16fc0 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
16fd0 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20   "BINARY", 0);. 
16fe0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
16ff0 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
17000 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c  /* Parse the fil
17010 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65  ename/URI argume
17020 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65  nt. */.  db->ope
17030 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  nFlags = flags;.
17040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17050 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69  rseUri(zVfs, zFi
17060 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20  lename, &flags, 
17070 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65  &db->pVfs, &zOpe
17080 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n, &zErrMsg);.  
17090 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
170a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
170b0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
170c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
170d0 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
170e0 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
170f0 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20  , rc, zErrMsg ? 
17100 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73  "%s" : 0, zErrMs
17110 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
17120 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
17130 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
17140 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  ut;.  }..  /* Op
17150 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64  en the backend d
17160 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a  atabase driver *
17170 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
17180 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
17190 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26  fs, zOpen, db, &
171a0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
171b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
171c0 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73             flags
171d0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
171e0 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72  AIN_DB);.  if( r
171f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17200 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17210 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
17220 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
17230 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
17240 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17250 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67  r(db, rc);.    g
17260 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
17270 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
17280 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b  eeEnter(db->aDb[
17290 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
172a0 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
172b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
172c0 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
172d0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
172e0 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44  treeLeave(db->aD
172f0 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
17300 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
17310 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
17320 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a  et(db, 0);..  /*
17330 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66   The default saf
17340 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety_level for th
17350 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
17360 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74  is 'full'; for t
17370 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
17380 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e  abase it is 'NON
17390 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  E'. This matches
173a0 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
173b0 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a   defaults.  .  *
173c0 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a  /.  db->aDb[0].z
173d0 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
173e0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
173f0 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20  ty_level = 3;.  
17400 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65  db->aDb[1].zName
17410 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
17420 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
17430 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d  evel = 1;..  db-
17440 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
17450 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
17460 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
17470 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
17480 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
17490 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
174a0 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
174b0 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
174c0 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
174d0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
174e0 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
174f0 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
17500 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
17510 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
17520 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
17530 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
17540 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
17550 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  E_OK);.  sqlite3
17560 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
17570 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  unctions(db);.. 
17580 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
17590 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
175a0 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
175b0 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
175c0 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
175d0 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
175e0 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
175f0 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63  ) API..  */.  rc
17600 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
17610 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  de(db);.  if( rc
17620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17630 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f     sqlite3AutoLo
17640 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  adExtensions(db)
17650 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
17660 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
17670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
17690 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
176a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
176b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
176c0 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS1.  if( !db->
176d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
176e0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
176f0 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73  qlite3Fts1Init(s
17700 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
17710 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e   = sqlite3Fts1In
17720 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
17730 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
17740 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20  E_ENABLE_FTS2.  
17750 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
17760 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
17770 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
17780 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
17790 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts2Init(sqlite3
177a0 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
177b0 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29  ite3Fts2Init(db)
177c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
177d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
177e0 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64  LE_FTS3.  if( !d
177f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17800 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
17810 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
17820 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
17830 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
17840 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17850 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
17860 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
17870 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
17880 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
17890 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
178a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
178b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
178c0 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
178d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
178e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
178f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17900 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
17910 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17920 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
17930 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
17940 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
17950 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
17960 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
17970 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
17980 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
17990 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
179a0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
179b0 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
179c0 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
179d0 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
179e0 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
179f0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
17a00 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
17a10 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
17a20 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
17a30 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
17a40 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
17a50 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
17a60 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
17a70 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
17a80 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
17ab0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
17ac0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
17ad0 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  c ) sqlite3Error
17ae0 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20  (db, rc);..  /* 
17af0 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61  Enable the looka
17b00 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73  side-malloc subs
17b10 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70  ystem */.  setup
17b20 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c  Lookaside(db, 0,
17b30 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
17b40 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65  nfig.szLookaside
17b50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17b60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17b70 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c  3GlobalConfig.nL
17b80 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71  ookaside);..  sq
17b90 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
17ba0 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c  eckpoint(db, SQL
17bb0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
17bc0 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b  AUTOCHECKPOINT);
17bd0 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20  ..opendb_out:.  
17be0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70  sqlite3_free(zOp
17bf0 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b  en);.  if( db ){
17c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
17c10 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54  >mutex!=0 || isT
17c20 68 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20  hreadsafe==0 || 
17c30 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17c40 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d  fig.bFullMutex==
17c50 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
17c60 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
17c70 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72  >mutex);.  }.  r
17c80 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
17c90 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72  ode(db);.  asser
17ca0 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d  t( db!=0 || rc==
17cb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
17cc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17cd0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71  _NOMEM ){.    sq
17ce0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
17cf0 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d  .    db = 0;.  }
17d00 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
17d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62  ITE_OK ){.    db
17d20 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
17d30 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d  _MAGIC_SICK;.  }
17d40 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23  .  *ppDb = db;.#
17d50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17d60 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28  BLE_SQLLOG.  if(
17d70 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
17d80 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a  nfig.xSqllog ){.
17d90 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61      /* Opening a
17da0 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72   db handle. Four
17db0 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
17dc0 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20  passed 0. */.   
17dd0 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71   void *pArg = sq
17de0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
17df0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20  g.pSqllogArg;.  
17e00 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
17e10 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41  onfig.xSqllog(pA
17e20 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d  rg, db, zFilenam
17e30 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  e, 0);.  }.#endi
17e40 66 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  f.  return sqlit
17e50 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29  e3ApiExit(0, rc)
17e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
17e70 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68  a new database h
17e80 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
17e90 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f  lite3_open(.  co
17ea0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
17eb0 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
17ec0 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74  **ppDb .){.  ret
17ed0 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
17ee0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  (zFilename, ppDb
17ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17f00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
17f10 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
17f20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
17f30 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71  TE, 0);.}.int sq
17f40 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20  lite3_open_v2(. 
17f50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
17f60 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61  ename,   /* Data
17f70 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55  base filename (U
17f80 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
17f90 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
17fa0 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74     /* OUT: SQLit
17fb0 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  e db handle */. 
17fc0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
17fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
17fe0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
17ff0 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f  r *zVfs        /
18000 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f  * Name of VFS mo
18010 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29  dule to use */.)
18020 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
18030 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65  atabase(filename
18040 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65  , ppDb, (unsigne
18050 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66  d int)flags, zVf
18060 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  s);.}..#ifndef S
18070 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
18080 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
18090 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
180a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
180b0 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73  3_open16(.  cons
180c0 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
180d0 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
180e0 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63  ppDb.){.  char c
180f0 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38  onst *zFilename8
18100 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65  ;   /* zFilename
18110 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d   encoded in UTF-
18120 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46  8 instead of UTF
18130 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -16 */.  sqlite3
18140 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
18150 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20  int rc;..#ifdef 
18160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
18170 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
18180 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
18190 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
181a0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
181b0 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
181c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
181d0 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
181e0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
181f0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
18200 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20  rn rc;.#endif.  
18210 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
18220 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22   ) zFilename = "
18230 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20 70 56 61  \000\000";.  pVa
18240 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
18250 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
18260 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
18270 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  l, -1, zFilename
18280 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
18290 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41  TIVE, SQLITE_STA
182a0 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  TIC);.  zFilenam
182b0 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  e8 = sqlite3Valu
182c0 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
182d0 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20  TE_UTF8);.  if( 
182e0 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20  zFilename8 ){.  
182f0 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62    rc = openDatab
18300 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20  ase(zFilename8, 
18310 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
18320 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18330 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
18340 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
18350 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20  CREATE, 0);.    
18360 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c  assert( *ppDb ||
18370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
18380 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  M );.    if( rc=
18390 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44  =SQLITE_OK && !D
183a0 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70  bHasProperty(*pp
183b0 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  Db, 0, DB_Schema
183c0 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20  Loaded) ){.     
183d0 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51   ENC(*ppDb) = SQ
183e0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
183f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
18400 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18410 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71  _NOMEM;.  }.  sq
18420 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
18430 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
18440 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
18450 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  , rc);.}.#endif 
18460 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
18470 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
18480 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
18490 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
184a0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
184b0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
184c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
184d0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
184e0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
184f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
18500 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
18510 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
18520 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
18530 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
18540 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
18550 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75  void*).){.  retu
18560 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
18570 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64  e_collation_v2(d
18580 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70  b, zName, enc, p
18590 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
185a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  );.}../*.** Regi
185b0 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
185c0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
185d0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
185e0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
185f0 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
18600 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
18610 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
18620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
18630 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
18640 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
18650 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
18660 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
18670 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
18680 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
18690 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
186a0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65    int rc;..#ifde
186b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
186c0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
186d0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
186e0 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
186f0 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  me==0 ) return S
18700 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
18710 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
18720 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
18730 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
18740 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
18750 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
18760 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
18770 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
18780 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
18790 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
187a0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
187b0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
187c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
187d0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
187e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
187f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18800 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
18810 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
18820 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18830 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
18840 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
18850 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
18860 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
18870 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
18880 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
18890 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20  ame,.  int enc, 
188a0 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
188b0 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
188c0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
188d0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
188e0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
188f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18900 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a    char *zName8;.
18910 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18920 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
18930 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
18940 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
18950 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  || zName==0 ) re
18960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
18970 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
18980 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18990 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
189a0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
189b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
189c0 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69  .  zName8 = sqli
189d0 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
189e0 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
189f0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
18a00 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a    if( zName8 ){.
18a10 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43      rc = createC
18a20 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
18a30 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  me8, (u8)enc, pC
18a40 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
18a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
18a60 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b  ree(db, zName8);
18a70 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
18a80 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
18a90 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
18aa0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
18ab0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
18ac0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
18ad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
18ae0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
18af0 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
18b00 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
18b10 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
18b20 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
18b30 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
18b40 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
18b50 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
18b60 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
18b70 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
18b80 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
18b90 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65  needed(.  sqlite
18ba0 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
18bb0 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
18bc0 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
18bd0 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69  eded)(void*,sqli
18be0 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
18bf0 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  p,const char*).)
18c00 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
18c10 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
18c20 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
18c30 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
18c40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18c50 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
18c60 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
18c70 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
18c80 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
18c90 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c  llNeeded = xColl
18ca0 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43  Needed;.  db->xC
18cb0 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b  ollNeeded16 = 0;
18cc0 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
18cd0 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
18ce0 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
18cf0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
18d00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
18d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18d20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18d30 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
18d40 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
18d50 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
18d60 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
18d70 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
18d80 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
18d90 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
18da0 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
18db0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
18dc0 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
18dd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
18de0 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a  ation_needed16(.
18df0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
18e00 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
18e10 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
18e20 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28  *xCollNeeded16)(
18e30 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
18e40 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
18e50 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64  t void*).){.#ifd
18e60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18e70 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
18e80 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
18e90 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
18ea0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
18eb0 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
18ec0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
18ed0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
18ee0 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
18ef0 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
18f00 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
18f10 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
18f20 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
18f30 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
18f40 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
18f50 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
18f60 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
18f70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
18f80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18f90 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
18fa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18fb0 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
18fc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
18fd0 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
18fe0 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
18ff0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
19000 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
19010 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
19020 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
19030 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
19040 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
19050 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
19060 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
19070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19080 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19090 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
190a0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
190b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
190c0 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
190d0 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
190e0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
190f0 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
19100 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
19110 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
19120 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
19130 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
19140 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
19150 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
19160 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
19170 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
19180 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74  ROLLBACK..*/.int
19190 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
191a0 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  ocommit(sqlite3 
191b0 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
191c0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
191d0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
191e0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
191f0 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
19200 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
19210 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
19220 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
19230 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
19240 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Commit;.}../*.**
19250 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
19260 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 73  outines are subs
19270 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
19280 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
19290 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
192a0 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
192b0 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
192c0 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62  IOERR and possib
192d0 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
192e0 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
192f0 65 79 20 73 65 72 76 65 20 74 77 6f 20 70 75 72  ey serve two pur
19300 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  poses:.**.**   1
19310 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f  .  Serve as a co
19320 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
19330 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
19340 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72  nt in a debugger
19350 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74  .**       to det
19360 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e  ect when version
19370 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
19380 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  s occurs..**.** 
19390 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c    2.  Invoke sql
193a0 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72  ite3_log() to pr
193b0 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65  ovide the source
193c0 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77   code location w
193d0 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20  here.**       a 
193e0 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
193f0 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65  is first detecte
19400 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
19410 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e  3CorruptError(in
19420 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
19430 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
19440 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
19450 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
19460 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  log(SQLITE_CORRU
19470 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT,.            
19480 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72    "database corr
19490 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25  uption at line %
194a0 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
194c0 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
194d0 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
194e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
194f0 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  RUPT;.}.int sqli
19500 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69  te3MisuseError(i
19510 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
19520 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
19530 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
19540 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
19550 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55  _log(SQLITE_MISU
19560 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  SE, .           
19570 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69     "misuse at li
19580 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
19590 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
195a0 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
195b0 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
195c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
195d0 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73  _MISUSE;.}.int s
195e0 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72  qlite3CantopenEr
195f0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
19600 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
19610 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19620 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
19630 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
19640 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20  _CANTOPEN, .    
19650 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
19660 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c  t open file at l
19670 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
19680 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
19690 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
196a0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
196b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
196c0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a  E_CANTOPEN;.}...
196d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
196e0 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
196f0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
19700 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
19710 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
19720 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
19730 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
19740 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
19750 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
19760 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
19770 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
19780 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
19790 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
197a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
197b0 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
197c0 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
197d0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
197e0 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
197f0 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
19800 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
19810 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
19820 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
19830 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
19840 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
19850 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
19860 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
19870 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
19880 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
19890 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
198a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
198b0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
198c0 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65  ADATA.int sqlite
198d0 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
198e0 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
198f0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
19900 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
19910 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
19920 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
19930 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
19940 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
19950 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
19960 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
19970 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
19980 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
19990 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
199a0 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
199b0 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
199c0 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
199d0 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
199e0 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
199f0 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
19a00 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
19a10 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
19a20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
19a30 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
19a40 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
19a50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
19a60 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
19a70 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
19a80 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
19a90 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
19aa0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
19ab0 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
19ac0 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
19ad0 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19af0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
19b00 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
19b10 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
19b20 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
19b30 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
19b40 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
19b50 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
19b60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
19b70 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ;..  char const 
19b80 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
19b90 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
19ba0 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
19bb0 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
19bc0 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
19bd0 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
19be0 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e  nc = 0;..  /* En
19bf0 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
19c00 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
19c10 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
19c20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19c30 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
19c40 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19c50 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d  rAll(db);.  rc =
19c60 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
19c70 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
19c80 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
19c90 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
19ca0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
19cb0 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
19cc0 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
19cd0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
19ce0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
19cf0 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
19d00 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
19d10 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
19d20 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
19d30 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
19d40 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
19d50 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
19d60 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
19d70 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
19d80 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
19d90 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  owid(zColumnName
19da0 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ) ){.    iCol = 
19db0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
19dc0 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
19dd0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
19de0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
19df0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
19e00 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
19e10 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
19e20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70  iCol++){.      p
19e30 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
19e40 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iCol];.      i
19e50 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
19e60 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
19e70 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  , zColumnName) )
19e80 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
19e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19ea0 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61     if( iCol==pTa
19eb0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
19ec0 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
19ed0 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
19ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19ef0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
19f00 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20  lock stores the 
19f10 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
19f20 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
19f30 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74  turned.  ** to t
19f40 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63  he caller in loc
19f50 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61  al variables zDa
19f60 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71  taType, zCollSeq
19f70 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61  , notnull, prima
19f80 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61  rykey.  ** and a
19f90 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20  utoinc. At this 
19fa0 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20  point there are 
19fb0 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65  two possibilitie
19fc0 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  s:.  ** .  **   
19fd0 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69    1. The specifi
19fe0 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  ed column name w
19ff0 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22  as rowid", "oid"
1a000 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20   or "_rowid_" . 
1a010 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74   **        and t
1a020 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69  here is no expli
1a030 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49  citly declared I
1a040 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a  PK column. .  **
1a050 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  .  **     2. The
1a060 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
1a070 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c  view and the col
1a080 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66  umn name identif
1a090 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20  ied an .  **    
1a0a0 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64      explicitly d
1a0b0 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20  eclared column. 
1a0c0 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d  Copy meta inform
1a0d0 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c  ation from *pCol
1a0e0 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43  ..  */ .  if( pC
1a0f0 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54  ol ){.    zDataT
1a100 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70  ype = pCol->zTyp
1a110 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  e;.    zCollSeq 
1a120 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
1a130 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f     notnull = pCo
1a140 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20  l->notNull!=0;. 
1a150 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d     primarykey  =
1a160 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
1a170 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
1a180 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f  EY)!=0;.    auto
1a190 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  inc = pTab->iPKe
1a1a0 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62  y==iCol && (pTab
1a1b0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1a1c0 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
1a1d0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1a1e0 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54  zDataType = "INT
1a1f0 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61  EGER";.    prima
1a200 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20  rykey = 1;.  }. 
1a210 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29   if( !zCollSeq )
1a220 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  {.    zCollSeq =
1a230 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a   "BINARY";.  }..
1a240 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
1a250 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
1a260 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  l(db);..  /* Whe
1a270 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  ther the functio
1a280 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64  n call succeeded
1a290 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20   or failed, set 
1a2a0 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
1a2b0 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68  eters.  ** to wh
1a2c0 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63  atever their loc
1a2d0 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20  al counterparts 
1a2e0 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65  contain. If an e
1a2f0 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a  rror did occur,.
1a300 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68    ** this has th
1a310 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f  e effect of zero
1a320 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70  ing all output p
1a330 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
1a340 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65    if( pzDataType
1a350 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d   ) *pzDataType =
1a360 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66   zDataType;.  if
1a370 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70  ( pzCollSeq ) *p
1a380 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c  zCollSeq = zColl
1a390 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e  Seq;.  if( pNotN
1a3a0 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20  ull ) *pNotNull 
1a3b0 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28  = notnull;.  if(
1a3c0 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a   pPrimaryKey ) *
1a3d0 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72  pPrimaryKey = pr
1a3e0 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20  imarykey;.  if( 
1a3f0 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74  pAutoinc ) *pAut
1a400 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a  oinc = autoinc;.
1a410 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1a420 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b  ==rc && !pTab ){
1a430 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1a440 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
1a450 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
1a460 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1a470 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1a480 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c   column: %s.%s",
1a490 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20   zTableName,.   
1a4a0 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65       zColumnName
1a4b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1a4c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1a4d0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
1a4e0 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  Msg(db, rc, (zEr
1a4f0 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
1a500 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1a510 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1a520 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
1a530 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
1a540 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
1a550 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1a560 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1a570 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1a580 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
1a590 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
1a5a0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
1a5b0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
1a5c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1a5d0 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
1a5e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1a5f0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
1a600 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
1a610 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
1a620 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
1a630 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
1a640 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
1a650 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
1a660 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
1a670 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
1a680 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
1a690 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
1a6a0 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
1a6b0 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
1a6c0 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
1a6d0 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
1a6e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a6f0 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
1a700 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
1a710 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
1a720 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a730 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
1a740 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
1a750 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23  b, int onoff){.#
1a760 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a770 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1a780 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1a790 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1a7a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1a7b0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1a7c0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1a7d0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1a7e0 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
1a7f0 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66  k = onoff ? 0xff
1a800 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20  ffffff : 0xff;. 
1a810 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1a820 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1a830 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a840 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1a850 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f  voke the xFileCo
1a860 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20  ntrol method on 
1a870 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1a880 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
1a890 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
1a8a0 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ol(sqlite3 *db, 
1a8b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1a8c0 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  ame, int op, voi
1a8d0 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20  d *pArg){.  int 
1a8e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1a8f0 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  R;.  Btree *pBtr
1a900 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ee;..#ifdef SQLI
1a910 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1a920 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1a930 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1a940 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1a950 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1a960 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1a970 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1a980 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72  ->mutex);.  pBtr
1a990 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  ee = sqlite3DbNa
1a9a0 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1a9b0 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42  bName);.  if( pB
1a9c0 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
1a9d0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73  r *pPager;.    s
1a9e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
1a9f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1aa00 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1aa10 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
1aa20 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
1aa30 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
1aa40 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1aa50 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65  .    fd = sqlite
1aa60 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
1aa70 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
1aa80 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  fd!=0 );.    if(
1aa90 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
1aaa0 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
1aab0 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
1aac0 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
1aad0 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  fd;.      rc = S
1aae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1aaf0 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  lse if( fd->pMet
1ab00 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63  hods ){.      rc
1ab10 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1ab20 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
1ab30 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pArg);.    }else
1ab40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ab50 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
1ab60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1ab70 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1ab80 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1ab90 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1aba0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1abb0 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a  n rc;   .}../*.*
1abc0 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74  * Interface to t
1abd0 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63  he testing logic
1abe0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1abf0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
1ac00 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e  t op, ...){.  in
1ac10 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65  t rc = 0;.#ifnde
1ac20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  f SQLITE_OMIT_BU
1ac30 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f  ILTIN_TEST.  va_
1ac40 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
1ac50 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
1ac60 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
1ac70 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65    /*.    ** Save
1ac80 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1ac90 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a  te of the PRNG..
1aca0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1acb0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1acc0 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20  PRNG_SAVE: {.   
1acd0 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61     sqlite3PrngSa
1ace0 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  veState();.     
1acf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1ad00 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
1ad10 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f  tore the state o
1ad20 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68  f the PRNG to th
1ad30 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76  e last state sav
1ad40 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ed using.    ** 
1ad50 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50  PRNG_SAVE.  If P
1ad60 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76  RNG_SAVE has nev
1ad70 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63  er before been c
1ad80 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  alled, then.    
1ad90 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74  ** this verb act
1ada0 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45  s like PRNG_RESE
1adb0 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  T..    */.    ca
1adc0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1add0 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a  RL_PRNG_RESTORE:
1ade0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1adf0 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65  PrngRestoreState
1ae00 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
1ae10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1ae20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20     ** Reset the 
1ae30 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73  PRNG back to its
1ae40 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
1ae50 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20  tate.  The next 
1ae60 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
1ae70 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1ae80 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20  s() will reseed 
1ae90 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61  the PRNG using a
1aea0 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20   single call.   
1aeb0 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64   ** to the xRand
1aec0 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66  omness method of
1aed0 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
1aee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1aef0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1af00 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a  L_PRNG_RESET: {.
1af10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
1af20 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20  ndomness(0,0);. 
1af30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1af40 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1af50 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1af60 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45  ontrol(BITVEC_TE
1af70 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61  ST, size, progra
1af80 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m).    **.    **
1af90 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69   Run a test agai
1afa0 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a  nst a Bitvec obj
1afb0 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68  ect of size.  Th
1afc0 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65  e program argume
1afd0 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20  nt.    ** is an 
1afe0 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
1aff0 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  s that defines t
1b000 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e  he test.  Return
1b010 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20   -1 on a.    ** 
1b020 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1b030 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75  n error, 0 on su
1b040 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  ccess, or non-ze
1b050 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  ro for an error.
1b060 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20  .    ** See the 
1b070 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
1b080 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61  ltinTest() for a
1b090 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1b0a0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
1b0b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1b0c0 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
1b0d0 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ST: {.      int 
1b0e0 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
1b0f0 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
1b100 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28  *aProg = va_arg(
1b110 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
1b120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
1b130 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73  vecBuiltinTest(s
1b140 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20  z, aProg);.     
1b150 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1b160 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1b170 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1b180 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  ol(FAULT_INSTALL
1b190 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20  , xCallback).   
1b1a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e   **.    ** Arran
1b1b0 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61  ge to invoke xCa
1b1c0 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65  llback() wheneve
1b1d0 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  r sqlite3FaultSi
1b1e0 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20  m() is called,. 
1b1f0 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61     ** if xCallba
1b200 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ck is not NULL..
1b210 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73      **.    ** As
1b220 20 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66   a test of the f
1b230 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d  ault simulator m
1b240 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c  echanism itself,
1b250 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1b260 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61  (0).    ** is ca
1b270 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
1b280 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e   after installin
1b290 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61  g the new callba
1b2a0 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ck and the retur
1b2b0 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66  n.    ** value f
1b2c0 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  rom sqlite3Fault
1b2d0 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74  Sim(0) becomes t
1b2e0 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20  he return from. 
1b2f0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65     ** sqlite3_te
1b300 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20  st_control()..  
1b310 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1b320 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41  LITE_TESTCTRL_FA
1b330 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20  ULT_INSTALL: {. 
1b340 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
1b350 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
1b360 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
1b370 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
1b380 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
1b390 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
1b3a0 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
1b3b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
1b3c0 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61  alConfig.xTestCa
1b3d0 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28  llback = va_arg(
1b3e0 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29  ap, int(*)(int))
1b3f0 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
1b400 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45   typedef int(*TE
1b410 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74  STCALLBACKFUNC_t
1b420 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  )(int);.      sq
1b430 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b440 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20  g.xTestCallback 
1b450 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53  = va_arg(ap, TES
1b460 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1b470 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1b480 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b  ite3FaultSim(0);
1b490 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b4a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1b4b0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1b4c0 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f  _control(BENIGN_
1b4d0 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42  MALLOC_HOOKS, xB
1b4e0 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20  egin, xEnd).    
1b4f0 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74  **.    ** Regist
1b500 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c  er hooks to call
1b510 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69   to indicate whi
1b520 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ch malloc() fail
1b530 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65  ures .    ** are
1b540 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a   benign..    */.
1b550 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b560 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
1b570 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a  MALLOC_HOOKS: {.
1b580 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
1b590 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69  id (*void_functi
1b5a0 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20  on)(void);.     
1b5b0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
1b5c0 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20  BenignBegin;.   
1b5d0 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
1b5e0 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20   xBenignEnd;.   
1b5f0 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20     xBenignBegin 
1b600 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1b610 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
1b620 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20     xBenignEnd = 
1b630 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
1b640 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
1b650 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61   sqlite3BenignMa
1b660 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67  llocHooks(xBenig
1b670 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45  nBegin, xBenignE
1b680 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nd);.      break
1b690 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1b6a0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1b6b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1b6c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
1b6d0 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67  DING_BYTE, unsig
1b6e0 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  ned int X).    *
1b6f0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1b700 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f   PENDING byte to
1b710 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
1b720 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58  e argument, if X
1b730 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20  >0..    ** Make 
1b740 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d  no changes if X=
1b750 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  =0.  Return the 
1b760 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e  value of the pen
1b770 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a  ding byte.    **
1b780 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20   as it existing 
1b790 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1b7a0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ine was called..
1b7b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d      **.    ** IM
1b7c0 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69  PORTANT:  Changi
1b7d0 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
1b7e0 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30  yte from 0x40000
1b7f0 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20  000 results in. 
1b800 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61     ** an incompa
1b810 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66  tible database f
1b820 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61  ile format.  Cha
1b830 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
1b840 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68  G byte.    ** wh
1b850 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65  ile any database
1b860 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
1b870 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75  pen results in u
1b880 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20  ndefined and.   
1b890 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20   ** deleterious 
1b8a0 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f  behavior..    */
1b8b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b8c0 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
1b8d0 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20  G_BYTE: {.      
1b8e0 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rc = PENDING_BYT
1b8f0 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
1b900 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
1b910 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
1b920 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d  ned int newVal =
1b930 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69   va_arg(ap, unsi
1b940 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
1b950 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
1b960 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
1b970 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
1b980 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b990 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1b9a0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1b9b0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1b9c0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1b9d0 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
1b9e0 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1b9f0 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
1ba00 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
1ba10 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
1ba20 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
1ba30 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
1ba40 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
1ba50 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
1ba60 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
1ba70 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
1ba80 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1ba90 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1baa0 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
1bab0 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
1bac0 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1bad0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
1bae0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
1baf0 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
1bb00 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
1bb10 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
1bb20 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
1bb30 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
1bb40 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
1bb50 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
1bb60 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
1bb70 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1bb80 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
1bb90 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
1bba0 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
1bbb0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bbc0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1bbd0 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
1bbe0 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
1bbf0 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
1bc00 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
1bc10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
1bc20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
1bc30 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
1bc40 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1bc50 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1bc60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1bc70 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
1bc80 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1bc90 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
1bca0 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
1bcb0 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
1bcc0 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
1bcd0 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
1bce0 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
1bcf0 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
1bd00 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
1bd10 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
1bd20 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
1bd30 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
1bd40 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
1bd50 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
1bd60 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
1bd70 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
1bd80 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
1bd90 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
1bda0 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
1bdb0 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
1bdc0 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
1bdd0 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
1bde0 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1bdf0 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
1be00 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
1be10 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
1be20 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
1be30 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
1be40 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
1be50 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
1be60 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
1be70 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
1be80 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
1be90 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
1bea0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1beb0 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
1bec0 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
1bed0 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
1bee0 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
1bef0 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
1bf00 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
1bf10 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
1bf20 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
1bf30 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1bf40 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1bf50 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1bf60 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1bf70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bf80 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
1bf90 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
1bfa0 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
1bfb0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1bfc0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
1bfd0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1bfe0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1bff0 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
1c000 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
1c010 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
1c020 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
1c030 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
1c040 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
1c050 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1c060 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1c070 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1c080 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
1c090 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1c0a0 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
1c0b0 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
1c0c0 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
1c0d0 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
1c0e0 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
1c0f0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1c100 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
1c110 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
1c120 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
1c130 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
1c140 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c150 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c160 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
1c170 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
1c180 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
1c190 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
1c1a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c1b0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1c1c0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1c1d0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c1e0 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52  STCTRL_BYTEORDER
1c1f0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1c200 20 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74   The integer ret
1c210 75 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68  urned reveals th
1c220 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20  e byte-order of 
1c230 74 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20  the computer on 
1c240 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c  which.    ** SQL
1c250 69 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a  ite is running:.
1c260 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1c270 20 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e      1     big-en
1c280 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69  dian,    determi
1c290 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a  ned at run-time.
1c2a0 20 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20      **      10  
1c2b0 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
1c2c0 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
1c2d0 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  run-time.    ** 
1c2e0 20 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d   432101     big-
1c2f0 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72  endian,    deter
1c300 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
1c310 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32  -time.    **  12
1c320 33 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d  3410     little-
1c330 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e  endian, determin
1c340 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1c350 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63  me.    */ .    c
1c360 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c370 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b  TRL_BYTEORDER: {
1c380 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c390 54 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30  TE_BYTEORDER*100
1c3a0 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45   + SQLITE_LITTLE
1c3b0 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49  ENDIAN*10 + SQLI
1c3c0 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20  TE_BIGENDIAN;.  
1c3d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c3e0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1c3f0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c400 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c410 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33  RESERVE, sqlite3
1c420 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
1c430 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1c440 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65  he nReserve size
1c450 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61   to N for the ma
1c460 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74  in database on t
1c470 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
1c480 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
1c490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1c4a0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1c4b0 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20  L_RESERVE: {.   
1c4c0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1c4d0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1c4e0 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  te3*);.      int
1c4f0 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   x = va_arg(ap,i
1c500 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1c510 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1c520 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1c530 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1c540 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  PageSize(db->aDb
1c550 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30  [0].pBt, 0, x, 0
1c560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c570 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1c580 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
1c590 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c5a0 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   /*  sqlite3_tes
1c5b0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1c5c0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
1c5d0 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33  ZATIONS, sqlite3
1c5e0 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
1c5f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
1c600 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72  e or disable var
1c610 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
1c620 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ns for testing p
1c630 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20  urposes.  The . 
1c640 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e     ** argument N
1c650 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
1c660 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
1c670 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20  o be disabled.  
1c680 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a  For normal.    *
1c690 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68  * operation N sh
1c6a0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1c6b0 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74  idea is that a t
1c6c0 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b  est program (lik
1c6d0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  e the.    ** SQL
1c6e0 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53   Logic Test or S
1c6f0 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20  LT test module) 
1c700 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65  can run the same
1c710 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69   SQL multiple ti
1c720 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  mes.    ** with 
1c730 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
1c740 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74  tions disabled t
1c750 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
1c760 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
1c770 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64    ** is obtained
1c780 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a   in every case..
1c790 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c7a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c7b0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b  OPTIMIZATIONS: {
1c7c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1c7d0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1c7e0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1c7f0 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20   db->dbOptFlags 
1c800 3d 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61  = (u16)(va_arg(a
1c810 70 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66  p, int) & 0xffff
1c820 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c830 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
1c840 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20  LITE_N_KEYWORD. 
1c850 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
1c860 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1c870 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
1c880 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72  WORD, const char
1c890 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a   *zWord).    **.
1c8a0 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20      ** If zWord 
1c8b0 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63  is a keyword rec
1c8c0 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70  ognized by the p
1c8d0 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75  arser, then retu
1c8e0 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75  rn the.    ** nu
1c8f0 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73  mber of keywords
1c900 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69  .  Or if zWord i
1c910 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c  s not a keyword,
1c920 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a   return 0..    *
1c930 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  * .    ** This t
1c940 65 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f  est feature is o
1c950 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  nly available in
1c960 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f   the amalgamatio
1c970 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74  n since.    ** t
1c980 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  he SQLITE_N_KEYW
1c990 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  ORD macro is not
1c9a0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73   defined in this
1c9b0 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a   file if SQLite.
1c9c0 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20      ** is built 
1c9d0 75 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73  using separate s
1c9e0 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20  ource files..   
1c9f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ca00 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
1ca10 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20  EYWORD: {.      
1ca20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72  const char *zWor
1ca30 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  d = va_arg(ap, c
1ca40 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
1ca50 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
1ca60 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64  e3Strlen30(zWord
1ca70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  );.      rc = (s
1ca80 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
1ca90 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29  e((u8*)zWord, n)
1caa0 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54  !=TK_ID) ? SQLIT
1cab0 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b  E_N_KEYWORD : 0;
1cac0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cad0 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20    }.#endif ..   
1cae0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
1caf0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1cb00 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
1cb10 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65  MALLOC, sz, &pNe
1cb20 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a  w, pFree);.    *
1cb30 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46  *.    ** Pass pF
1cb40 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33  ree into sqlite3
1cb50 53 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a  ScratchFree(). .
1cb60 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74      ** If sz>0 t
1cb70 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73  hen allocate a s
1cb80 63 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e  cratch buffer in
1cb90 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a  to pNew.  .    *
1cba0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1cbb0 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
1cbc0 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20  CHMALLOC: {.    
1cbd0 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a    void *pFree, *
1cbe0 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e  *ppNew;.      in
1cbf0 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d  t sz;.      sz =
1cc00 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1cc10 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20  ;.      ppNew = 
1cc20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
1cc30 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20  *);.      pFree 
1cc40 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1cc50 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  d*);.      if( s
1cc60 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c  z ) *ppNew = sql
1cc70 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
1cc80 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  c(sz);.      sql
1cc90 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
1cca0 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72  pFree);.      br
1ccb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ccc0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1ccd0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1cce0 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
1ccf0 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f  IME_FAULT, int o
1cd00 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  noff);.    **.  
1cd10 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65    ** If paramete
1cd20 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a  r onoff is non-z
1cd30 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74  ero, configure t
1cd40 68 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74  he wrappers so t
1cd50 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  hat all.    ** s
1cd60 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1cd70 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61  to localtime() a
1cd80 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c  nd variants fail
1cd90 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65  . If onoff is ze
1cda0 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20  ro,.    ** undo 
1cdb0 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20  this setting..  
1cdc0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1cdd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
1cde0 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b  CALTIME_FAULT: {
1cdf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1ce00 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61  obalConfig.bLoca
1ce10 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f  ltimeFault = va_
1ce20 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1ce30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ce40 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1ce50 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ce60 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ce70 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69  NEVER_CORRUPT, i
1ce80 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt);.    **.    
1ce90 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
1cea0 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
1ceb0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64  cates that the d
1cec0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1ced0 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20  always well-.   
1cee0 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e   ** formed and n
1cef0 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54  ever corrupt.  T
1cf00 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61  his flag is clea
1cf10 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e  r by default, in
1cf20 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20  dicating that.  
1cf30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1cf40 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61  les might have a
1cf50 72 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74  rbitrary corrupt
1cf60 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68  ion.  Setting th
1cf70 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20  e flag during.  
1cf80 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75    ** testing cau
1cf90 73 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65  ses certain asse
1cfa0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1cfb0 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62  in the code to b
1cfc0 65 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20  e activated.    
1cfd0 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72  ** that demonstr
1cfe0 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e  at invariants on
1cff0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
1d000 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20  abase files..   
1d010 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d020 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
1d030 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20  ER_CORRUPT: {.  
1d040 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1d050 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72  lConfig.neverCor
1d060 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70  rupt = va_arg(ap
1d070 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1d080 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
1d090 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1d0a0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1d0b0 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f  E_TESTCTRL_VDBE_
1d0c0 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62  COVERAGE, xCallb
1d0d0 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a  ack, ptr);.    *
1d0e0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1d0f0 20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63   VDBE coverage c
1d100 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
1d110 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69   to xCallback wi
1d120 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20  th context .    
1d130 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a  ** pointer ptr..
1d140 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1d150 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d160 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b  VDBE_COVERAGE: {
1d170 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
1d180 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20  DBE_COVERAGE.   
1d190 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
1d1a0 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63  (*branch_callbac
1d1b0 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c  k)(void*,int,u8,
1d1c0 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  u8);.      sqlit
1d1d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1d1e0 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f  VdbeBranch = va_
1d1f0 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61  arg(ap,branch_ca
1d200 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73  llback);.      s
1d210 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1d220 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72  ig.pVdbeBranchAr
1d230 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f  g = va_arg(ap,vo
1d240 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  id*);.#endif.   
1d250 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d260 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1d270 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1d280 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
1d290 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20  ORTER_MMAP, db, 
1d2a0 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61  nMax); */.    ca
1d2b0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1d2c0 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20  RL_SORTER_MMAP: 
1d2d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
1d2e0 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
1d2f0 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
1d300 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
1d310 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
1d320 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1d330 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1d340 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1d350 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1d360 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
1d370 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1d380 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1d390 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20  K if SQLite has 
1d3a0 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
1d3b0 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f   and SQLITE_ERRO
1d3c0 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e  R if.    ** not.
1d3d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d3e0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d3f0 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20  _ISINIT: {.     
1d400 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1d410 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d  alConfig.isInit=
1d420 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
1d430 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
1d440 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1d450 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
1d460 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1d470 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20  IT_BUILTIN_TEST 
1d480 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1d490 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
1d4a0 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69   a utility routi
1d4b0 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46  ne, useful to VF
1d4c0 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
1d4d0 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a  s, that checks.*
1d4e0 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61  * to see if a da
1d4f0 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20  tabase file was 
1d500 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61  a URI that conta
1d510 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20  ined a specific 
1d520 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65  query .** parame
1d530 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f  ter, and if so o
1d540 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  btains the value
1d550 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61   of the query pa
1d560 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
1d570 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1d580 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c  ument is the fil
1d590 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61  ename pointer pa
1d5a0 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f  ssed into the xO
1d5b0 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  pen().** method 
1d5c0 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65  of a VFS impleme
1d5d0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50  ntation.  The zP
1d5e0 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73  aram argument is
1d5f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1d600 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
1d610 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68  ter we seek.  Th
1d620 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1d630 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1d640 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61  the zParam.** pa
1d650 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78  rameter if it ex
1d660 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61  ists.  If the pa
1d670 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74  rameter does not
1d680 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75   exist, this rou
1d690 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
1d6a0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
1d6b0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1d6c0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1d6d0 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  eter(const char 
1d6e0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73  *zFilename, cons
1d6f0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b  t char *zParam){
1d700 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1d710 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30  ==0 || zParam==0
1d720 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
1d730 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1d740 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1d750 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68  ename) + 1;.  wh
1d760 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  ile( zFilename[0
1d770 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ] ){.    int x =
1d780 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
1d790 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  e, zParam);.    
1d7a0 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1d7b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1d7c0 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  lename) + 1;.   
1d7d0 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75   if( x==0 ) retu
1d7e0 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  rn zFilename;.  
1d7f0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1d800 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d810 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1d820 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1d830 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1d840 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66   boolean value f
1d850 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
1d860 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eter..*/.int sql
1d870 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
1d880 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1d890 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
1d8a0 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20  ar *zParam, int 
1d8b0 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20  bDflt){.  const 
1d8c0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1d8d0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1d8e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1d8f0 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44  m);.  bDflt = bD
1d900 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e  flt!=0;.  return
1d910 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42   z ? sqlite3GetB
1d920 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29  oolean(z, bDflt)
1d930 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   : bDflt;.}../*.
1d940 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62  ** Return a 64-b
1d950 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
1d960 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
1d970 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74  ameter..*/.sqlit
1d980 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
1d990 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f  _uri_int64(.  co
1d9a0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1d9b0 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame,    /* Filen
1d9c0 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f  ame as passed to
1d9d0 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73   xOpen */.  cons
1d9e0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
1d9f0 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72        /* URI par
1da00 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f  ameter sought */
1da10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1da20 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20   bDflt       /* 
1da30 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65  return if parame
1da40 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a  ter is missing *
1da50 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1da60 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
1da70 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
1da80 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1da90 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1daa0 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73   v;.  if( z && s
1dab0 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
1dac0 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49  I64(z, &v)==SQLI
1dad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66  TE_OK ){.    bDf
1dae0 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  lt = v;.  }.  re
1daf0 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  turn bDflt;.}../
1db00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1db10 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64  Btree pointer id
1db20 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e  entified by zDbN
1db30 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ame.  Return NUL
1db40 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
1db50 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65  */.Btree *sqlite
1db60 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73  3DbNameToBtree(s
1db70 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1db80 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
1db90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1dba0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1dbb0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
1dbc0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20  b->aDb[i].pBt.  
1dbd0 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d     && (zDbName==
1dbe0 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
1dbf0 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d  Cmp(zDbName, db-
1dc00 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  >aDb[i].zName)==
1dc10 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
1dc20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69  return db->aDb[i
1dc30 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ].pBt;.    }.  }
1dc40 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1dc50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1dc60 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
1dc70 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
1dc80 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
1dc90 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
1dca0 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
1dcb0 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
1dcc0 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
1dcd0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1dce0 7a 44 62 4e 61 6d 65 29 7b 0a 23 69 66 64 65 66  zDbName){.#ifdef
1dcf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1dd00 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1dd10 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1dd20 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1dd30 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
1dd40 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
1dd50 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
1dd60 69 66 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  if.  Btree *pBt 
1dd70 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1dd80 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1dd90 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
1dda0 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
1ddb0 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29  GetFilename(pBt)
1ddc0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   : 0;.}../*.** R
1ddd0 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61 62  eturn 1 if datab
1dde0 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ase is read-only
1ddf0 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77 72   or 0 if read/wr
1de00 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ite.  Return -1 
1de10 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61  if.** no such da
1de20 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a  tabase exists..*
1de30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
1de40 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65  _readonly(sqlite
1de50 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1de60 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 23 69 66  r *zDbName){.#if
1de70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1de80 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1de90 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1dea0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
1deb0 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
1dec0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
1ded0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1dee0 23 65 6e 64 69 66 0a 20 20 42 74 72 65 65 20 2a  #endif.  Btree *
1def0 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1df00 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1df10 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1df20 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
1df30 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70  treeIsReadonly(p
1df40 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a              Bt) : -1;.}.