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

Artifact d7a31f8c19c27b046cef381369381bba379c3730:


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 20 0a     ** compile. .
2d80: 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e      */.#if defin
2d90: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
2da0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
2db0: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20 20 20  THREADSAFE>0.   
2dc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2dd0: 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
2de0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2df0: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
2e00: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
2e10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2e20: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20  CoreMutex = 0;. 
2e30: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2e40: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
2e50: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
2e60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2e70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2e80: 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20  IG_MULTITHREAD: 
2e90: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62  {.      /* Disab
2ea0: 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64  le mutexing of d
2eb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2ec0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ons */.      /* 
2ed0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  Enable mutexing 
2ee0: 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74 72  of core data str
2ef0: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20  uctures */.     
2f00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f10: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2f20: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2f40: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f60: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f70: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
2f80: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
2f90: 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  Enable all mutex
2fa0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2fb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fc0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
2fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2fe0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ff0: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
3000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3020: 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20  NFIG_MUTEX: {.  
3030: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
3040: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75  n alternative mu
3050: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
3060: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
3070: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3080: 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28  mutex = *va_arg(
3090: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
30a0: 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  x_methods*);.   
30b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30d0: 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a  CONFIG_GETMUTEX:
30e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
30f0: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
3100: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
3110: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a  ation */.      *
3120: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3130: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
3140: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3150: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a  alConfig.mutex;.
3160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3170: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20   }.#endif...    
3180: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3190: 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  IG_MALLOC: {.   
31a0: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
31b0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c   alternative mal
31c0: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
31d0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
31e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
31f0: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3200: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3210: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
3220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3230: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3240: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
3250: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3260: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c  the current mall
3270: 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74  oc() implementat
3280: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ion */.      if(
3290: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32a0: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d  nfig.m.xMalloc==
32b0: 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  0 ) sqlite3MemSe
32c0: 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20  tDefault();.    
32d0: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
32e0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
32f0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
3300: 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20  balConfig.m;.   
3310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3320: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3330: 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53  CONFIG_MEMSTATUS
3340: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
3350: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
3360: 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73  he malloc status
3370: 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20   collection */. 
3380: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3390: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
33a0: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
33b0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
33c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
33d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
33e0: 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20  CRATCH: {.      
33f0: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
3400: 75 66 66 65 72 20 66 6f 72 20 73 63 72 61 74 63  uffer for scratc
3410: 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  h memory space *
3420: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3430: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
3440: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
3450: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
3460: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3470: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20  fig.szScratch = 
3480: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
34a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61  obalConfig.nScra
34b0: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
34c0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
34d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
34e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
34f0: 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20  _PAGECACHE: {.  
3500: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
3510: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 70 61   a buffer for pa
3520: 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72 79 20  ge cache memory 
3530: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
3540: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3550: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
3560: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3570: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3580: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
3590: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
35a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
35b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
35c0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
35d0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
35e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
35f0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3600: 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  PCACHE: {.      
3610: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
3620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3630: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3640: 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a  ONFIG_GETPCACHE:
3650: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20   {.      /* now 
3660: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
3670: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3680: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
3690: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
36a0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
36b0: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
36c0: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
36d0: 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
36e0: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
36f0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3700: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3710: 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f  g.pcache2 = *va_
3720: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3730: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a  pcache_methods2*
3740: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3750: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3760: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3770: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
3780: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3790: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
37a0: 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  .xInit==0 ){.   
37b0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
37c0: 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  heSetDefault();.
37d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76        }.      *v
37e0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37f0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
3800: 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  2*) = sqlite3Glo
3810: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
3820: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
3830: 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
3840: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
3850: 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66  _MEMSYS3) || def
3860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
3870: 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20  LE_MEMSYS5).    
3880: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3890: 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20  IG_HEAP: {.     
38a0: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
38b0: 62 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20  buffer for heap 
38c0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a  memory space */.
38d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
38e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
38f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3900: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3910: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3920: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
3930: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3940: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3950: 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67  g.mnReq = va_arg
3960: 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20  (ap, int);..    
3970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
3980: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c  balConfig.mnReq<
3990: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
39a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
39b0: 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20  .mnReq = 1;.    
39c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
39d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
39e0: 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b  mnReq>(1<<12) ){
39f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20  .        /* cap 
3a00: 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65  min request size
3a10: 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20   at 2^12 */.    
3a20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3a30: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3a40: 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d  (1<<12);.      }
3a50: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3a70: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
3a80: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65      /* If the he
3a90: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55  ap pointer is NU
3aa0: 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65  LL, then restore
3ab0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c   the malloc impl
3ac0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20  ementation.     
3ad0: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55     ** back to NU
3ae0: 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e  LL pointers too.
3af0: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
3b00: 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20  e the malloc to 
3b10: 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  go.        ** ba
3b20: 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c  ck to its defaul
3b30: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
3b40: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e   when sqlite3_in
3b50: 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20  itialize() is.  
3b60: 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20        ** run..  
3b70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
3b80: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
3b90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20  GlobalConfig.m, 
3ba0: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
3bb0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29  3GlobalConfig.m)
3bc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68          /* The h
3be0: 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  eap pointer is n
3bf0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e  ot NULL, then in
3c00: 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65  stall one of the
3c10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35  .        ** mem5
3c20: 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64  .c/mem3.c method
3c30: 73 2e 20 20 54 68 65 20 65 6e 63 6c 6f 73 69 6e  s.  The enclosin
3c40: 67 20 23 69 66 20 67 75 61 72 61 6e 74 65 65 73  g #if guarantees
3c50: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
3c60: 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 73  east one of thes
3c70: 65 20 6d 65 74 68 6f 64 73 20 69 73 20 63 75 72  e methods is cur
3c80: 72 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64 2e 0a  rently enabled..
3c90: 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
3ca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3cb0: 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20  MEMSYS3.        
3cc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3cd0: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
3ce0: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b  MemGetMemsys3();
3cf0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
3d00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
3d10: 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c  SYS5.        sql
3d20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3d30: 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d  .m = *sqlite3Mem
3d40: 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65  GetMemsys5();.#e
3d50: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
3d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
3d80: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
3d90: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
3da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3db0: 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
3dc0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3dd0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3de0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3df0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
3e00: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3e20: 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f      .    /* Reco
3e30: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
3e40: 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74  the logger funct
3e50: 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73  ion and its firs
3e60: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
3e70: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  ** The default i
3e80: 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67  s NULL.  Logging
3e90: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20   is disabled if 
3ea0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  the function poi
3eb0: 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e  nter is.    ** N
3ec0: 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20  IG_LOG: {.      
3ef0: 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
3f00: 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
3f10: 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
3f20: 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
3f30: 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
3f40: 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
3f50: 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
3f60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3f70: 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72  fig.xLog = va_ar
3f80: 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f  g(ap, void(*)(vo
3f90: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3fa0: 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a  ar*));.      */.
3fb0: 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
3fc0: 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76  id(*LOGFUNC_t)(v
3fd0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
3fe0: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  har*);.      sql
3ff0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4000: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
4010: 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20  p, LOGFUNC_t);. 
4020: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4030: 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67  alConfig.pLogArg
4040: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
4050: 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  id*);.      brea
4060: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4070: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4080: 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65 20  55548-33817 The 
4090: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65 74  compile-time set
40a0: 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69 6c  ting for URI fil
40b0: 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63 61  enames.    ** ca
40c0: 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74 20  n be changed at 
40d0: 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e 67  start-time using
40e0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   the.    ** sqli
40f0: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
4100: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29 20  E_CONFIG_URI,1) 
4110: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
4120: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
4130: 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63 6f  CONFIG_URI,0) co
4140: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c 6c  nfiguration call
4150: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
4160: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4170: 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71  _URI: {.      sq
4180: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4190: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
41a0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
41b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
41c0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
41d0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
41e0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
41f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4200: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
4210: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
4220: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4230: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
4240: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
4250: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
4260: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
4270: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
4280: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
4290: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
42a0: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
42b0: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
42c0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
42d0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
42e0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
42f0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4300: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4310: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
4320: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4330: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
4340: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4360: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
4370: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4380: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
4390: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
43a0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
43b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
43c0: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
43d0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
43e0: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  4);.      if( mx
43f0: 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70  Mmap<0 || mxMmap
4400: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50  >SQLITE_MAX_MMAP
4410: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
4420: 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   mxMmap = SQLITE
4430: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a  _MAX_MMAP_SIZE;.
4440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4450: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4460: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
4470: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  p;.      if( szM
4480: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
4490: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
44a0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
44b0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
44c0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
44d0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
44e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
44f0: 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
4500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4510: 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
4520: 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64  S_WIN && defined
4530: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
4540: 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65 20 53  LLOC).    case S
4550: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
4560: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
4570: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4580: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
4590: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
45a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
45b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
45c0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
45d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
45e0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
45f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
4600: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
4610: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4620: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
4630: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
4640: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
4650: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
4660: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
4670: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
4680: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
4690: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
46a0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
46b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
46c0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
46d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
46e0: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
46f0: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
4700: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
4710: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
4720: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
4730: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
4740: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
4750: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
4760: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4770: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4780: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
4790: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
47a0: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
47b0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
47c0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
47d0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
47e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
47f0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
4800: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
4810: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
4820: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
4830: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
4840: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4850: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4860: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
4870: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
4880: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
4890: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
48a0: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
48b0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
48c0: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
48d0: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
48e0: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
48f0: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
4900: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
4910: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4920: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
4930: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
4940: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4950: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
4960: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
4970: 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65  kaside slot afte
4980: 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65  r ROUNDDOWN8 nee
4990: 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a  ds to be larger.
49a0: 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e    ** than a poin
49b0: 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c  ter to be useful
49c0: 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f  ..  */.  sz = RO
49d0: 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f  UNDDOWN8(sz);  /
49e0: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
49f0: 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a  9382 */.  if( sz
4a00: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  <=(int)sizeof(Lo
4a10: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20  okasideSlot*) ) 
4a20: 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e  sz = 0;.  if( cn
4a30: 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20  t<0 ) cnt = 0;. 
4a40: 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e   if( sz==0 || cn
4a50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  t==0 ){.    sz =
4a60: 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
4a70: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4a80: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pBuf==0 ){.    s
4a90: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
4aa0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
4ab0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
4ac0: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
4ad0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34    /* IMP: R-6194
4ae0: 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73  9-35727 */.    s
4af0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4b00: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
4b10: 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20   pStart ) cnt = 
4b20: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
4b30: 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20  e(pStart)/sz;.  
4b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72  }else{.    pStar
4b50: 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20  t = pBuf;.  }.  
4b60: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
4b70: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
4b80: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4b90: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
4ba0: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
4bb0: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
4bc0: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
4bd0: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
4be0: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
4bf0: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
4c00: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
4c10: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
4c20: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
4c30: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
4c40: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
4c50: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
4c60: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
4c70: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
4c80: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4c90: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
4ca0: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4cb0: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
4cc0: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
4cd0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4ce0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
4cf0: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
4d00: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
4d10: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4d20: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
4d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
4d40: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4d50: 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  art = db;.    db
4d60: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4d70: 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c   = db;.    db->l
4d80: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4d90: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
4da0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4db0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
4dc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4de0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
4df0: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
4e00: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4e10: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
4e20: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
4e30: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
4e40: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  {.  return db->m
4e50: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
4e60: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
4e70: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
4e80: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
4e90: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
4ea0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
4eb0: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
4ec0: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
4ed0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4ee0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4ef0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
4f00: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
4f10: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
4f20: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
4f30: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
4f40: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
4f50: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
4f60: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50  ( pBt ){.      P
4f70: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
4f80: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4f90: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
4fa0: 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
4fb0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
4fc0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
4fd0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
4fe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4ff0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
5000: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5010: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
5020: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
5030: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
5040: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
5050: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
5060: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
5070: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
5080: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
5090: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
50a0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
50b0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
50c0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
50d0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
50e0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
50f0: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
5100: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
5110: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
5120: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
5130: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
5140: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
5150: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
5160: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
5170: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
5180: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
5190: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
51a0: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
51b0: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
51c0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
51d0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
51e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
51f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5200: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5210: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
5220: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
5230: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
5240: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
5250: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
5260: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
5270: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
5280: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
5290: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
52a0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
52b0: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
52c0: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
52d0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
52e0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
52f0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
5300: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
5310: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
5320: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
5330: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5340: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
5350: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
5360: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
5370: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
5380: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
5390: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
53a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
53b0: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
53c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
53d0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
53e0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
53f0: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
5400: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
5410: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
5420: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
5430: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
5440: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
5450: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
5460: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
5470: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
5480: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
5490: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
54a0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
54b0: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
54c0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
54d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
54e0: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
54f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5500: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
5510: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
5520: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
5530: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5540: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
5550: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
5560: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
5570: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
5580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5590: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
55a0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
55b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
55c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
55d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
55e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
55f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
5600: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
5610: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
5620: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
5630: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
5640: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
5650: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
5660: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
5670: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
5680: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
5690: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
56a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
56b0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
56c0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
56d0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
56e0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
56f0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
5700: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
5710: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
5720: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
5730: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
5740: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
5750: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
5760: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
5770: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
5780: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
5790: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
57a0: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
57b0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
57c0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
57d0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
57e0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
57f0: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
5800: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
5810: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
5820: 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
5830: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
5840: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
5850: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
5860: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
5870: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
5880: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
5890: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
58a0: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
58b0: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
58c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  {.      /* Leave
58d0: 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74   rc unchanged at
58e0: 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b   0 */.    }else{
58f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
5900: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
5910: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
5930: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
5940: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
5950: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
5960: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
5970: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
5980: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
5990: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
59a0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
59b0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
59c0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
59d0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
59e0: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
59f0: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
5a00: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
5a10: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
5a20: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
5a30: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
5a40: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
5a50: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
5a60: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
5a70: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
5a80: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
5a90: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
5aa0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
5ab0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
5ac0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
5ad0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
5ae0: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
5af0: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
5b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
5b10: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
5b20: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
5b30: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
5b40: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
5b50: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
5b60: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
5b70: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
5b80: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
5b90: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
5ba0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
5bb0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
5bc0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
5bd0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
5be0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5bf0: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
5c00: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
5c10: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
5c20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5c30: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
5c40: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
5c50: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
5c60: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
5c70: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
5c80: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5c90: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
5ca0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
5cb0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5cc0: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
5cd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
5ce0: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
5cf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
5d00: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
5d10: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
5d20: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
5d30: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5d40: 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73  Close all open s
5d50: 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20  avepoints. This 
5d60: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61  function only ma
5d70: 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73  nipulates fields
5d80: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5d90: 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ase handle objec
5da0: 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  t, it does not c
5db0: 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69  lose any savepoi
5dc0: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  nts that may be 
5dd0: 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62  open.** at the b
5de0: 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65  -tree/pager leve
5df0: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
5e00: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
5e10: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5e20: 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
5e30: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53  vepoint ){.    S
5e40: 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d  avepoint *pTmp =
5e50: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
5e60: 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f  .    db->pSavepo
5e70: 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
5e80: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  t;.    sqlite3Db
5e90: 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
5ea0: 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70    }.  db->nSavep
5eb0: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  oint = 0;.  db->
5ec0: 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
5ed0: 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
5ee0: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
5ef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5f00: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
5f10: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69   function associ
5f20: 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65  ated with FuncDe
5f30: 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63  f p, if any. Exc
5f40: 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20  ept,.** if this 
5f50: 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
5f60: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63  copy of the func
5f70: 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76  tion, do not inv
5f80: 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65  oke it. Multiple
5f90: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20  .** copies of a 
5fa0: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20  single function 
5fb0: 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e  are created when
5fc0: 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e   create_function
5fd0: 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  () is called.** 
5fe0: 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20  with SQLITE_ANY 
5ff0: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e  as the encoding.
6000: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6010: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
6020: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
6030: 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63  cDef *p){.  Func
6040: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
6050: 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65  tructor = p->pDe
6060: 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20  structor;.  if( 
6070: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
6080: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
6090: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
60a0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
60b0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  f==0 ){.      pD
60c0: 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74  estructor->xDest
60d0: 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d  roy(pDestructor-
60e0: 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20  >pUserData);.   
60f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6100: 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72  (db, pDestructor
6110: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
6120: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
6130: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61   all sqlite3_vta
6140: 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62  b objects that b
6150: 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73  elong to databas
6160: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
6170: 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  db. This is call
6180: 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65  ed when db is be
6190: 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  ing closed..*/.s
61a0: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f  tatic void disco
61b0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c  nnectAllVtab(sql
61c0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64  ite3 *db){.#ifnd
61d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
61e0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
61f0: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t i;.  sqlite3Bt
6200: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6210: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6220: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6230: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
6240: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
6250: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64  chema;.    if( d
6260: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
6270: 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  a ){.      HashE
6280: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  lem *p;.      fo
6290: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
62a0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
62b0: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
62c0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
62d0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
62e0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
62f0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
6300: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
6310: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
6320: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
6330: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
6340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6350: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
6360: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
6370: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
6380: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c  eaveAll(db);.#el
6390: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
63a0: 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69  METER(db);.#endi
63b0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
63c0: 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61  n TRUE if databa
63d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
63e0: 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64   has unfinalized
63f0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6400: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6410: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6420: 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a  ckup objects.  .
6430: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
6440: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73  nnectionIsBusy(s
6450: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
6460: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
6470: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6480: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
6490: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
64a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
64b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
64c0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; j++){.    Btr
64d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
64e0: 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[j].pBt;.    if
64f0: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
6500: 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28  BtreeIsInBackup(
6510: 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  pBt) ) return 1;
6520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6540: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
6550: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73  te database.*/.s
6560: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6570: 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  3Close(sqlite3 *
6580: 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d  db, int forceZom
6590: 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20  bie){.  if( !db 
65a0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
65b0: 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31  CE-OF: R-63257-1
65c0: 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c  1740 Calling sql
65d0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a  ite3_close() or.
65e0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
65f0: 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20 61  lose_v2() with a
6600: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72   NULL pointer ar
6610: 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d  gument is a harm
6620: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  less no-op. */. 
6630: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6640: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
6650: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6660: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
6670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6680: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6690: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
66a0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
66b0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72  utex);..  /* For
66c0: 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63  ce xDisconnect c
66d0: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
66e0: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
66f0: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
6700: 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  b(db);..  /* If 
6710: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
6720: 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f   open, the disco
6730: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63  nnectAllVtab() c
6740: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
6750: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
6760: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
6770: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
6780: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
6790: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
67a0: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
67b0: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
67c0: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
67d0: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
67e0: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
67f0: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
6800: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
6810: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
6820: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
6830: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
6840: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
6850: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
6860: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
6870: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6880: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
6890: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
68a0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
68b0: 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61    /* Legacy beha
68c0: 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c  vior (sqlite3_cl
68d0: 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20  ose() behavior) 
68e0: 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  is to return.  *
68f0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  * SQLITE_BUSY if
6900: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6910: 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  can not be close
6920: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
6930: 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65   */.  if( !force
6940: 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63  Zombie && connec
6950: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
6960: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6970: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
6980: 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62  LITE_BUSY, "unab
6990: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
69a0: 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22  to unfinalized "
69b0: 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65  .       "stateme
69c0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
69d0: 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20  d backups");.   
69e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
69f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
6a00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6a10: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69  TE_BUSY;.  }..#i
6a20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6a30: 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
6a40: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
6a50: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
6a60: 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68     /* Closing th
6a70: 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  e handle. Fourth
6a80: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
6a90: 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32  ssed the value 2
6aa0: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
6ab0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
6ac0: 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62  llog(sqlite3Glob
6ad0: 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
6ae0: 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a  Arg, db, 0, 2);.
6af0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6b00: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e   Convert the con
6b10: 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a  nection into a z
6b20: 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63  ombie and then c
6b30: 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  lose it..  */.  
6b40: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
6b50: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b  TE_MAGIC_ZOMBIE;
6b60: 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  .  sqlite3LeaveM
6b70: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
6b80: 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ie(db);.  return
6b90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6ba0: 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69  *.** Two variati
6bb0: 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69  ons on the publi
6bc0: 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  c interface for 
6bd0: 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61  closing a databa
6be0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
6bf0: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c  . The sqlite3_cl
6c00: 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65  ose() version re
6c10: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
6c20: 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20  Y and.** leaves 
6c30: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
6c40: 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ption if there a
6c50: 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  re unfinalized p
6c60: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
6c70: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6c80: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
6c90: 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ups.  The sqlite
6ca0: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20  3_close_v2().** 
6cb0: 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74  version forces t
6cc0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
6cd0: 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65   become a zombie
6ce0: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
6cf0: 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72   unclosed resour
6d00: 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65  ces, and arrange
6d10: 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69  s for deallocati
6d20: 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  on when the last
6d30: 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74  .** prepare stat
6d40: 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33  ement or sqlite3
6d50: 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a  _backup closes..
6d60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
6d70: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
6d80: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6d90: 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a  3Close(db,0); }.
6da0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
6db0: 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62  e_v2(sqlite3 *db
6dc0: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6dd0: 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a  3Close(db,1); }.
6de0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
6df0: 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
6e00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6e10: 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72  b..**.** Further
6e20: 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73  more, if databas
6e30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
6e40: 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61  is a zombie (mea
6e50: 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a  ning that there.
6e60: 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  ** has been a pr
6e70: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
6e80: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72  te3_close(db) or
6e90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6ea0: 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76  2(db)) and.** ev
6eb0: 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ery sqlite3_stmt
6ec0: 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69   has now been fi
6ed0: 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72  nalized and ever
6ee0: 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  y sqlite3_backup
6ef0: 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64   has.** finished
6f00: 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20  , then free all 
6f10: 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f  resources..*/.vo
6f20: 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  id sqlite3LeaveM
6f30: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
6f40: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ie(sqlite3 *db){
6f50: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20  .  HashElem *i; 
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
6f80: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
6f90: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt j;..  /* If t
6fa0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
6fb0: 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d  ding sqlite3_stm
6fc0: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
6fd0: 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a  kup objects.  **
6fe0: 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65   or if the conne
6ff0: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  ction has not ye
7000: 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79  t been closed by
7010: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
7020: 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a  2(),.  ** then j
7030: 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75  ust leave the mu
7040: 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  tex and return..
7050: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
7060: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
7070: 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e  IC_ZOMBIE || con
7080: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62  nectionIsBusy(db
7090: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
70a0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
70b0: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
70c0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  urn;.  }..  /* I
70d0: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
70e0: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
70f0: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
7100: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
7110: 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c  .  ** closed all
7120: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e   sqlite3_stmt an
7130: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
7140: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73   objects and has
7150: 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65   been.  ** passe
7160: 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d to sqlite3_clo
7170: 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  se (meaning that
7180: 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29   it is a zombie)
7190: 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20  .  Therefore,.  
71a0: 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
71b0: 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  free all resourc
71c0: 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49  es..  */..  /* I
71d0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
71e0: 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74  is open, roll it
71f0: 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f   back. This also
7200: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66   ensures that if
7210: 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61  .  ** any databa
7220: 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20  se schemas have 
7230: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79  been modified by
7240: 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20   an uncommitted 
7250: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
7260: 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e   they are reset.
7270: 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65   And that the re
7280: 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75  quired b-tree mu
7290: 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d  tex is held to m
72a0: 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ake.  ** the pag
72b0: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  er rollback and 
72c0: 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20  schema reset an 
72d0: 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e  atomic operation
72e0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f  . */.  sqlite3Ro
72f0: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
7300: 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20  LITE_OK);..  /* 
7310: 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e  Free any outstan
7320: 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73  ding Savepoint s
7330: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20  tructures. */.  
7340: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
7350: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f  points(db);..  /
7360: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61  * Close all data
7370: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
7380: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
7390: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
73a0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
73b0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
73c0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
73d0: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
73e0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
73f0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
7400: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
7410: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
7420: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
7430: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
7440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
7450: 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73  Clear the TEMP s
7460: 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79  chema separately
7470: 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69   and last */.  i
7480: 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  f( db->aDb[1].pS
7490: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c  chema ){.    sql
74a0: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
74b0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
74c0: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
74d0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
74e0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  (db);..  /* Free
74f0: 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66   up the array of
7500: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
7510: 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ases */.  sqlite
7520: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
7530: 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73  eArray(db);.  as
7540: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32  sert( db->nDb<=2
7550: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
7560: 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74  ->aDb==db->aDbSt
7570: 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65  atic );..  /* Te
7580: 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e  ll the code in n
7590: 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65  otify.c that the
75a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c   connection no l
75b0: 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a  onger holds any.
75c0: 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64    ** locks and d
75d0: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
75e0: 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f  any further unlo
75f0: 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
7600: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  cks..  */.  sqli
7610: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f  te3ConnectionClo
7620: 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  sed(db);..  for(
7630: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
7640: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
7650: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
7660: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
7670: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
7680: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
7690: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
76a0: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
76b0: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
76c0: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
76d0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
76e0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
76f0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
7700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7710: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7720: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
7730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7740: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
7750: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
7760: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
7770: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
7780: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
7790: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
77a0: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
77b0: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
77c0: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
77d0: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
77e0: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
77f0: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
7800: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
7810: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
7820: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
7830: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
7840: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
7850: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
7860: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7870: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7880: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
7890: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
78a0: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
78b0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
78c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
78d0: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
78e0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
78f0: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
7900: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
7910: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
7920: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
7930: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
7940: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
7950: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
7960: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
7970: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
7980: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7990: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
79a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
79b0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
79c0: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
79d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
79e0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f  b, SQLITE_OK); /
79f0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
7a00: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
7a10: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
7a20: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
7a30: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
7a40: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
7a50: 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54  s(db);.#if SQLIT
7a60: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
7a70: 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f  ATION.  sqlite3_
7a80: 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41  free(db->auth.zA
7a90: 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69  uthUser);.  sqli
7aa0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74  te3_free(db->aut
7ab0: 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64  h.zAuthPW);.#end
7ac0: 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  if..  db->magic 
7ad0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
7ae0: 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  RROR;..  /* The 
7af0: 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63  temp-database sc
7b00: 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  hema is allocate
7b10: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  d differently fr
7b20: 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68  om the other sch
7b30: 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ema.  ** objects
7b40: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61   (using sqliteMa
7b50: 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c  lloc() directly,
7b60: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
7b70: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29  te3BtreeSchema()
7b80: 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65  )..  ** So it ne
7b90: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
7ba0: 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20  here. Todo: Why 
7bb0: 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d  not roll the tem
7bc0: 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20  p schema into.  
7bd0: 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69  ** the same sqli
7be0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68  teMalloc() as th
7bf0: 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63  e one that alloc
7c00: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
7c10: 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  e .  ** structur
7c20: 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e?.  */.  sqlite
7c30: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
7c40: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
7c50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7c60: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
7c70: 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  );.  db->magic =
7c80: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
7c90: 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OSED;.  sqlite3_
7ca0: 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d  mutex_free(db->m
7cb0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
7cc0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
7cd0: 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61  Out==0 );  /* Fa
7ce0: 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69  ils on a lookasi
7cf0: 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a  de memory leak *
7d00: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
7d10: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
7d20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
7d30: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
7d40: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
7d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
7d60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
7d70: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
7d80: 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69  e files.  If tri
7d90: 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
7da0: 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20  ITE_OK, then.** 
7db0: 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  any open cursors
7dc0: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
7dd0: 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73   ("tripped" - as
7de0: 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20   in "tripping a 
7df0: 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b  circuit.** break
7e00: 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f  er") and made to
7e10: 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65   return tripCode
7e20: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
7e30: 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74  y further.** att
7e40: 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61  empts to use tha
7e50: 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  t cursor..*/.voi
7e60: 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
7e70: 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  kAll(sqlite3 *db
7e80: 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
7e90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7ea0: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 61  inTrans = 0;.  a
7eb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7ec0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
7ed0: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
7ee0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
7ef0: 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61  oc();..  /* Obta
7f00: 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75  in all b-tree mu
7f10: 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b  texes before mak
7f20: 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  ing any calls to
7f30: 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
7f40: 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  . .  ** This is 
7f50: 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73  important in cas
7f60: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
7f70: 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  n being rolled b
7f80: 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64  ack has.  ** mod
7f90: 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
7fa0: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68  se schema. If th
7fb0: 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  e b-tree mutexes
7fc0: 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20   are not taken. 
7fd0: 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61   ** here, then a
7fe0: 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61  nother shared-ca
7ff0: 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  che connection m
8000: 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65  ight sneak in be
8010: 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64  tween.  ** the d
8020: 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b  atabase rollback
8030: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
8040: 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75  t, which can cau
8050: 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f  se false.  ** co
8060: 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73  rruption reports
8070: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20   in some cases. 
8080: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
8090: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
80a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
80b0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
80c0: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
80d0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
80e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69  if( p ){.      i
80f0: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
8100: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
8110: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
8120: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
8130: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
8140: 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f  llback(p, tripCo
8150: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
8160: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
8170: 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69  back(db);.  sqli
8180: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
8190: 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64 62  oc();..  if( (db
81a0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
81b0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30  nternChanges)!=0
81c0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
81d0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
81e0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
81f0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
8200: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
8210: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
8220: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
8230: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
8240: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
8250: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
8260: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
8270: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
8280: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
8290: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
82a0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
82b0: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
82c0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
82d0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
82e0: 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  erFKs;..  /* If 
82f0: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
8300: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
8310: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
8320: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
8330: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
8340: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
8350: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
8360: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
8370: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
8380: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
8390: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
83a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
83b0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f  static string co
83c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
83d0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
83e0: 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  to the error cod
83f0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69  e.** specified i
8400: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
8410: 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28  */.#if (defined(
8420: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
8430: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 29 20   SQLITE_OS_WIN) 
8440: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
8450: 45 5f 54 45 53 54 29 0a 63 6f 6e 73 74 20 63 68  E_TEST).const ch
8460: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
8470: 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f  me(int rc){.  co
8480: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
8490: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72  = 0;.  int i, or
84a0: 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72  igRc = rc;.  for
84b0: 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61  (i=0; i<2 && zNa
84c0: 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26  me==0; i++, rc &
84d0: 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69  = 0xff){.    swi
84e0: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20  tch( rc ){.     
84f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8520: 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20  _OK";           
8530: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8540: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
8550: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
8560: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8570: 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20  E_ERROR";       
8580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8590: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
85a0: 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20  NTERNAL:        
85b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
85c0: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
85d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
85e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
85f0: 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20  PERM:           
8600: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8610: 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20  ITE_PERM";      
8620: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8630: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8640: 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20  _ABORT:         
8650: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8660: 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20  LITE_ABORT";    
8670: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8680: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8690: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
86a0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
86b0: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
86c0: 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b  BACK";    break;
86d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
86e0: 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20  TE_BUSY:        
86f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8700: 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20  SQLITE_BUSY";   
8710: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8720: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8730: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
8740: 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  Y:      zName = 
8750: 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43  "SQLITE_BUSY_REC
8760: 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72 65 61  OVERY";     brea
8770: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8780: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
8790: 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  OT:      zName =
87a0: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e   "SQLITE_BUSY_SN
87b0: 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65  APSHOT";     bre
87c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
87d0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
87e0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
87f0: 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  = "SQLITE_LOCKED
8800: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
8810: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8820: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
8830: 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65  AREDCACHE: zName
8840: 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   = "SQLITE_LOCKE
8850: 44 5f 53 48 41 52 45 44 43 41 43 48 45 22 3b 62  D_SHAREDCACHE";b
8860: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8870: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20   SQLITE_NOMEM:  
8880: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
8890: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  e = "SQLITE_NOME
88a0: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
88b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
88c0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
88d0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  Y:           zNa
88e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
88f0: 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20  DONLY";         
8900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8910: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
8920: 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e  LY_RECOVERY:  zN
8930: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
8940: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22  ADONLY_RECOVERY"
8950: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
8960: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
8970: 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a  NLY_CANTLOCK:  z
8980: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
8990: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
89a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
89b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
89c0: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  ONLY_ROLLBACK:  
89d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
89e0: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
89f0: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
8a00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
8a10: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20  DONLY_DBMOVED:  
8a20: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8a30: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
8a40: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
8a50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
8a60: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
8a70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8a80: 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20  E_INTERRUPT";   
8a90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8aa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8ab0: 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20  OERR:           
8ac0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8ad0: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
8ae0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8af0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8b00: 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20  IOERR_READ:     
8b10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8b20: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b  ITE_IOERR_READ";
8b30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8b40: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8b50: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
8b60: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
8b70: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
8b80: 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a  _READ";  break;.
8b90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8ba0: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20  E_IOERR_WRITE:  
8bb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8bc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
8bd0: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
8be0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8bf0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20  TE_IOERR_FSYNC: 
8c00: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8c10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
8c20: 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  NC";       break
8c30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8c40: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
8c50: 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  YNC:    zName = 
8c60: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
8c70: 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61  R_FSYNC";   brea
8c80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8c90: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
8ca0: 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATE:     zName =
8cb0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54   "SQLITE_IOERR_T
8cc0: 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65  RUNCATE";    bre
8cd0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8ce0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
8cf0: 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  T:        zName 
8d00: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8d10: 46 53 54 41 54 22 3b 20 20 20 20 20 20 20 62 72  FSTAT";       br
8d20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8d30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
8d40: 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  OCK:       zName
8d50: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8d60: 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62  _UNLOCK";      b
8d70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8d80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
8d90: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LOCK:       zNam
8da0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8db0: 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20  R_RDLOCK";      
8dc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8dd0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
8de0: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61  ELETE:       zNa
8df0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8e00: 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20  RR_DELETE";     
8e10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8e20: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8e30: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e  NOMEM:        zN
8e40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8e50: 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ERR_NOMEM";     
8e60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8e70: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8e80: 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a  _ACCESS:       z
8e90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8ea0: 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20  OERR_ACCESS";   
8eb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8ed0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
8ee0: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OCK:.           
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8f10: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
8f20: 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62  RESERVEDLOCK"; b
8f30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8f40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
8f50: 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  CK:         zNam
8f60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8f70: 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20  R_LOCK";        
8f80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8f90: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
8fa0: 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61  LOSE:        zNa
8fb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8fc0: 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20  RR_CLOSE";      
8fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8fe0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8ff0: 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e  DIR_CLOSE:    zN
9000: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
9010: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20  ERR_DIR_CLOSE"; 
9020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9030: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
9040: 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a  _SHMOPEN:      z
9050: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
9060: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20  OERR_SHMOPEN";  
9070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9080: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
9090: 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20  R_SHMSIZE:      
90a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
90b0: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20  IOERR_SHMSIZE"; 
90c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
90d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
90e0: 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20  RR_SHMLOCK:     
90f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9100: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b  _IOERR_SHMLOCK";
9110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9120: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
9130: 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20  ERR_SHMMAP:     
9140: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9150: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b  E_IOERR_SHMMAP";
9160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9170: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
9180: 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20  OERR_SEEK:      
9190: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
91a0: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20  TE_IOERR_SEEK"; 
91b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
91c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
91d0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
91e0: 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  NT: zName = "SQL
91f0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
9200: 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20  _NOENT";break;. 
9210: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9220: 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20  _IOERR_MMAP:    
9230: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9240: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22  LITE_IOERR_MMAP"
9250: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
9260: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9270: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
9280: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
9290: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
92a0: 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  EMPPATH"; break;
92b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
92c0: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
92d0: 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  H:     zName = "
92e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
92f0: 56 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b  VPATH";    break
9300: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9310: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
9320: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9330: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22  "SQLITE_CORRUPT"
9340: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
9350: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9360: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
9370: 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  B:       zName =
9380: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
9390: 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65  _VTAB";      bre
93a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
93b0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20  QLITE_NOTFOUND: 
93c0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
93d0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  = "SQLITE_NOTFOU
93e0: 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  ND";          br
93f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9400: 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20  SQLITE_FULL:    
9410: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9420: 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22   = "SQLITE_FULL"
9430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
9440: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9450: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9460: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
9470: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
9480: 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20  OPEN";          
9490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
94a0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
94b0: 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61  N_NOTEMPDIR: zNa
94c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
94d0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22  TOPEN_NOTEMPDIR"
94e0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
94f0: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
9500: 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e  EN_ISDIR:     zN
9510: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
9520: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20  NTOPEN_ISDIR";  
9530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9540: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
9550: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a  PEN_FULLPATH:  z
9560: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9570: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
9580: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
9590: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
95a0: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OPEN_CONVPATH:  
95b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
95c0: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
95d0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
95e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f   case SQLITE_PRO
95f0: 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20  TOCOL:          
9600: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9610: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20  _PROTOCOL";     
9620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
9640: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
9650: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9660: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
9670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
9690: 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20  CHEMA:          
96a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
96b0: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
96c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
96d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
96e0: 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20  TOOBIG:         
96f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9700: 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20  ITE_TOOBIG";    
9710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9720: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9730: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20  _CONSTRAINT:    
9740: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9750: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
9760: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
9770: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9780: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
9790: 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  QUE:  zName = "S
97a0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
97b0: 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b  _UNIQUE"; break;
97c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
97d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
97e0: 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22  IGGER: zName = "
97f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9800: 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b  T_TRIGGER";break
9810: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9820: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
9830: 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20  OREIGNKEY:.     
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9860: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
9870: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
9880: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9890: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
98a0: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20  NSTRAINT_CHECK: 
98b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
98c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
98d0: 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CK";  break;.   
98e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
98f0: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
9900: 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  YKEY:.          
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9930: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9940: 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20  _PRIMARYKEY";   
9950: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9960: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9970: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61  INT_NOTNULL: zNa
9980: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
9990: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22  STRAINT_NOTNULL"
99a0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
99b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
99c0: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a  AINT_COMMITHOOK:
99d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9a00: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
9a10: 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b  ITHOOK";   break
9a20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9a30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
9a40: 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TAB:    zName = 
9a50: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
9a60: 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61  NT_VTAB";   brea
9a70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9a80: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9a90: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9ac0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9ad0: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20  AINT_FUNCTION"; 
9ae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9af0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9b00: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20  STRAINT_ROWID:  
9b10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9b20: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
9b30: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
9b40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
9b50: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
9b60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9b70: 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20  E_MISMATCH";    
9b80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
9ba0: 49 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20  ISUSE:          
9bb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9bc0: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
9bd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9be0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9bf0: 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20  NOLFS:          
9c00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9c10: 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20  ITE_NOLFS";     
9c20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9c30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9c40: 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20  _AUTH:          
9c50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9c60: 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20  LITE_AUTH";     
9c70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9c80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9c90: 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20  E_FORMAT:       
9ca0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9cb0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20  QLITE_FORMAT";  
9cc0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9cd0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9ce0: 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20  TE_RANGE:       
9cf0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9d00: 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20  SQLITE_RANGE";  
9d10: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9d20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9d30: 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20  ITE_NOTADB:     
9d40: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9d50: 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b  "SQLITE_NOTADB";
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9d70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9d80: 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20  LITE_ROW:       
9d90: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9da0: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20   "SQLITE_ROW";  
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9dc0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9dd0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20  QLITE_NOTICE:   
9de0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9df0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
9e00: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9e10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9e20: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
9e30: 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65  COVER_WAL: zName
9e40: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
9e50: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62  E_RECOVER_WAL";b
9e60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9e70: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52   SQLITE_NOTICE_R
9e80: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a  ECOVER_ROLLBACK:
9e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9ec0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
9ed0: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
9ee0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9ef0: 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20  ITE_WARNING:    
9f00: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9f10: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22  "SQLITE_WARNING"
9f20: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
9f30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9f40: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
9f50: 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d  OINDEX:  zName =
9f60: 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47   "SQLITE_WARNING
9f70: 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65  _AUTOINDEX"; bre
9f80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9f90: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20  QLITE_DONE:     
9fa0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9fb0: 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b  = "SQLITE_DONE";
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
9fd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
9fe0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
9ff0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
a000: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73   zBuf[50];.    s
a010: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a020: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
a030: 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e  uf, "SQLITE_UNKN
a040: 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63  OWN(%d)", origRc
a050: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a  );.    zName = z
a060: 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Buf;.  }.  retur
a070: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
a080: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
a090: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
a0a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
a0b0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
a0c0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
a0d0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
a0e0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
a0f0: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
a100: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
a110: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
a120: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
a130: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
a140: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
a150: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
a160: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
a170: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
a180: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
a190: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
a1a0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
a1b0: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
a1c0: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
a1d0: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
a1e0: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
a1f0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a200: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
a210: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
a220: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
a230: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
a240: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
a250: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
a260: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
a270: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
a280: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
a290: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
a2a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
a2b0: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
a2c0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
a2d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
a2e0: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
a2f0: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
a300: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
a310: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a320: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
a330: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
a340: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
a350: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
a360: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
a370: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
a380: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
a390: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
a3a0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
a3b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
a3c0: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
a3d0: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
a3e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
a3f0: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
a400: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
a410: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
a420: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
a430: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
a440: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
a450: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
a460: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
a470: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
a480: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
a490: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
a4a0: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
a4b0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
a4c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
a4d0: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
a4e0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
a4f0: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
a500: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
a510: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
a520: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
a530: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a540: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
a550: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
a560: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a570: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
a580: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
a590: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
a5a0: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
a5b0: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
a5c0: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
a5d0: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
a5e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
a5f0: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
a600: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
a610: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
a620: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
a630: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
a640: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
a650: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
a660: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
a670: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
a680: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
a690: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
a6a0: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
a6b0: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
a6c0: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
a6d0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a6e0: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
a6f0: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
a700: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
a710: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
a720: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
a730: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
a740: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
a750: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
a760: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
a770: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
a780: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
a790: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
a7a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a7b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
a7c0: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
a7d0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
a7e0: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
a7f0: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
a800: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
a810: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
a820: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
a830: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a840: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a850: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
a860: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
a870: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
a880: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
a890: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
a8a0: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
a8b0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
a8c0: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
a8d0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
a8e0: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
a8f0: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
a900: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
a910: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
a920: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a930: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
a940: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
a950: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
a960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a970: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a980: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
a9b0: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
a9c0: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
a9d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
a9e0: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
a9f0: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
aa00: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
aa10: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
aa20: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
aa30: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
aa40: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
aa50: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
aa60: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
aa70: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
aa80: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
aa90: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
aaa0: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
aab0: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
aac0: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
aad0: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
aae0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
aaf0: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
ab00: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
ab10: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
ab20: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
ab30: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
ab40: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
ab50: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
ab60: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
ab70: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
ab80: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
ab90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
aba0: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
abb0: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
abc0: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
abd0: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
abe0: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
abf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
ac00: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
ac10: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
ac20: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
ac30: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
ac40: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
ac50: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
ac60: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
ac70: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
ac80: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
ac90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
aca0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
acb0: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
acc0: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
acd0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
ace0: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
acf0: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
ad00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ad10: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
ad20: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
ad30: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
ad40: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
ad50: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
ad60: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
ad70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ad80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
ad90: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
ada0: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
adb0: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
adc0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
add0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
ade0: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
adf0: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
ae00: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
ae10: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
ae20: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
ae30: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
ae40: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
ae50: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
ae60: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
ae70: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
ae80: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
ae90: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
aea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
aeb0: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
aec0: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
aed0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
aee0: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
aef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
af00: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
af10: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
af20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
af30: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
af40: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
af50: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
af60: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
af70: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
af80: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
af90: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
afa0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
afb0: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
afc0: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
afd0: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
afe0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
aff0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b000: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
b010: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
b020: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
b030: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
b040: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
b050: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
b060: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
b070: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
b080: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
b090: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
b0a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
b0b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b0c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b0d0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
b0e0: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
b0f0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
b100: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
b110: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
b120: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
b130: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
b140: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
b150: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
b160: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
b170: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
b180: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
b190: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
b1a0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
b1b0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
b1c0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
b1d0: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
b1e0: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
b1f0: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
b200: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
b210: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
b220: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
b230: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
b240: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
b250: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
b260: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
b270: 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e  ps = (unsigned)n
b280: 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  Ops;.    db->pPr
b290: 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67  ogressArg = pArg
b2a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
b2b0: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30  b->xProgress = 0
b2c0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
b2d0: 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20  essOps = 0;.    
b2e0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
b2f0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
b300: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
b310: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  db->mutex);.}.#e
b320: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
b330: 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c  s routine instal
b340: 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73  ls a default bus
b350: 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77  y handler that w
b360: 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  aits for the.** 
b370: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
b380: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
b390: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
b3a0: 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  g 0..*/.int sqli
b3b0: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
b3c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
b3d0: 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e  t ms){.  if( ms>
b3e0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b3f0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
b400: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
b410: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
b420: 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d  id*)db);.    db-
b430: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
b440: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
b450: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
b460: 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a  dler(db, 0, 0);.
b470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b480: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b490: 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69   Cause any pendi
b4a0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ng operation to 
b4b0: 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c  stop at its earl
b4c0: 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79  iest opportunity
b4d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b4e0: 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69  3_interrupt(sqli
b4f0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
b500: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
b510: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
b520: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
b530: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
b540: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
b550: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
b560: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
b570: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
b580: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
b590: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
b5a0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
b5b0: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
b5c0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
b5d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
b5e0: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
b5f0: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
b600: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
b610: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
b620: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
b630: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
b640: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
b650: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
b660: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
b670: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
b680: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
b690: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
b6a0: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
b6b0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
b6c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
b6d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
b6e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
b6f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
b700: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
b710: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
b720: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
b730: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
b740: 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20  pDestructor.){. 
b750: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
b760: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  nt nName;.  int 
b770: 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61  extraFlags;..  a
b780: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b790: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
b7a0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
b7b0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
b7c0: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
b7d0: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
b7e0: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
b7f0: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
b800: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
b810: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
b820: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
b830: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
b840: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
b850: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
b860: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
b870: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
b880: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b890: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
b8a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
b8b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
b8c0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  PT;.  }..  asser
b8d0: 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  t( SQLITE_FUNC_C
b8e0: 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f  ONSTANT==SQLITE_
b8f0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b  DETERMINISTIC );
b900: 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20  .  extraFlags = 
b910: 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45  enc &  SQLITE_DE
b920: 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65  TERMINISTIC;.  e
b930: 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55  nc &= (SQLITE_FU
b940: 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54  NC_ENCMASK|SQLIT
b950: 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64  E_ANY);.  .#ifnd
b960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
b970: 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c  TF16.  /* If SQL
b980: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
b990: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
b9a0: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
b9b0: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
b9c0: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
b9d0: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
b9e0: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
b9f0: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
ba00: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
ba10: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
ba20: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
ba30: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20  ternally..  **. 
ba40: 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e   ** If SQLITE_AN
ba50: 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  Y is specified, 
ba60: 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f  add three versio
ba70: 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ns of the functi
ba80: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68  on.  ** to the h
ba90: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
baa0: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
bab0: 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65  E_UTF16 ){.    e
bac0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
bad0: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65  6NATIVE;.  }else
bae0: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
baf0: 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ANY ){.    int 
bb00: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
bb10: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
bb20: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
bb30: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
bb40: 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  TF8|extraFlags,.
bb50: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
bb60: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
bb70: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
bb80: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
bb90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bba0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
bbb0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
bbc0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
bbd0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
bbe0: 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73  F16LE|extraFlags
bbf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
bc00: 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53  rData, xFunc, xS
bc10: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
bc20: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
bc30: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
bc40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
bc50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
bc60: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
bc70: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23  E_UTF16BE;.  }.#
bc80: 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c  else.  enc = SQL
bc90: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66  ITE_UTF8;.#endif
bca0: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
bcb0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75  f an existing fu
bcc0: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
bcd0: 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65  overridden or de
bce0: 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20  leted. If so,.  
bcf0: 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
bd00: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65   active VMs, the
bd10: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
bd20: 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74  BUSY. If a funct
bd30: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ion.  ** is bein
bd40: 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c  g overridden/del
bd50: 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61  eted but there a
bd60: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
bd70: 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a  , allow the.  **
bd80: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f   operation to co
bd90: 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c  ntinue but inval
bda0: 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d  idate all precom
bdb0: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
bdc0: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
bdd0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
bde0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
bdf0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
be00: 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20   (u8)enc, 0);.  
be10: 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e  if( p && (p->fun
be20: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
be30: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65  FUNC_ENCMASK)==e
be40: 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e  nc && p->nArg==n
be50: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Arg ){.    if( d
be60: 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
be70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
be80: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
be90: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
bea0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
beb0: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
bec0: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
bed0: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
bee0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
bef0: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
bf00: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
bf10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bf20: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
bf30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bf40: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
bf50: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
bf60: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
bf70: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
bf80: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
bf90: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
bfa0: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
bfb0: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
bfc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
bfd0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
bfe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bff0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
c000: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
c010: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
c020: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
c030: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
c040: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
c050: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
c060: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
c070: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
c080: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
c090: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
c0a0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
c0b0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
c0c0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
c0d0: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
c0e0: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
c0f0: 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e  funcFlags = (p->
c100: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
c110: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
c120: 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20   | extraFlags;. 
c130: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75   testcase( p->fu
c140: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
c150: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
c160: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
c170: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
c180: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
c190: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
c1a0: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
c1b0: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
c1c0: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
c1d0: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
c1e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c1f0: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
c200: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
c210: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
c220: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
c230: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
c240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
c250: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
c260: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
c270: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
c280: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
c290: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
c2a0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
c2b0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
c2c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c2d0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
c2e0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
c2f0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
c300: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
c310: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
c320: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
c330: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
c340: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
c350: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
c380: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
c390: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c3a0: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
c3b0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
c3c0: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
c3d0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
c3e0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
c3f0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c400: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c410: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c420: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
c430: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
c440: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c450: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
c460: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
c470: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
c480: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
c490: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
c4a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c4b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
c4c0: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
c4d0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
c4e0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
c4f0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
c500: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
c510: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
c520: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
c530: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c540: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
c550: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
c560: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
c570: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
c580: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
c590: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
c5a0: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
c5b0: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
c5c0: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
c5d0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
c5e0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
c5f0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
c600: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
c610: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
c620: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
c630: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
c640: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c650: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
c660: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
c670: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c680: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
c690: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
c6a0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
c6b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c6c0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
c6d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c6e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c6f0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
c700: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c710: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
c720: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
c730: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
c740: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
c750: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
c760: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
c770: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c780: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c790: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c7a0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
c7b0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
c7c0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c7d0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c7e0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
c7f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
c800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
c810: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
c820: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c830: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c840: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
c850: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
c860: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
c870: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
c880: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
c890: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
c8a0: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
c8b0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c8c0: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
c8d0: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
c8e0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
c8f0: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
c900: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
c910: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c920: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
c930: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c940: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
c950: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c960: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c970: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
c980: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
c990: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
c9a0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
c9b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
c9c0: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
c9d0: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
c9e0: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
c9f0: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
ca00: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
ca10: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
ca20: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
ca30: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
ca40: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
ca50: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
ca60: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
ca70: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
ca80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
ca90: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
caa0: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
cab0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
cac0: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
cad0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
cae0: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
caf0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
cb00: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
cb10: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
cb20: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
cb30: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
cb40: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
cb50: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
cb60: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
cb70: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
cb80: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
cb90: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
cba0: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
cbb0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
cbc0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
cbd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
cbe0: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
cbf0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
cc00: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
cc10: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
cc20: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
cc30: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
cc40: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
cc50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cc60: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
cc70: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
cc80: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
ccb0: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
ccc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
ccd0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
cce0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
ccf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
cd00: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
cd10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
cd20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cd30: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
cd40: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
cd50: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
cd60: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
cd70: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
cd80: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
cd90: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
cda0: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
cdb0: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
cdc0: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
cdd0: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
cde0: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
cdf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
ce00: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
ce10: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
ce20: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
ce30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
ce40: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
ce50: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
ce60: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
ce70: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
ce80: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
ce90: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
cea0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ceb0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
cec0: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
ced0: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
cee0: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
cef0: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
cf00: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
cf10: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
cf20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
cf30: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
cf40: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
cf50: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
cf60: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
cf70: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
cf80: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
cf90: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
cfa0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
cfb0: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
cfc0: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
cfd0: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
cfe0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
cff0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
d000: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
d010: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
d020: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
d030: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
d040: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
d050: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
d060: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
d070: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
d080: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
d090: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
d0a0: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
d0b0: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
d0c0: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
d0d0: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
d0e0: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
d0f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
d100: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
d110: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
d120: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
d130: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
d140: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
d150: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d160: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d170: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d180: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
d190: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d1a0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
d1b0: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
d1c0: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
d1d0: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
d1e0: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
d1f0: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
d200: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d210: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
d220: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
d230: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
d240: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
d250: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
d260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d280: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
d290: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
d2a0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
d2b0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
d2c0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
d2d0: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
d2e0: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
d2f0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
d300: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
d310: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
d320: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
d330: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
d340: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d350: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
d360: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
d370: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
d380: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
d390: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
d3a0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
d3b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d3c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
d3d0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
d3e0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d3f0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
d400: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
d410: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
d420: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
d430: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
d440: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
d450: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
d460: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
d470: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
d480: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d490: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d4a0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d4b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d4c0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d4d0: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
d4e0: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
d4f0: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
d500: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d520: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
d530: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
d540: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
d550: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d560: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d570: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
d580: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
d590: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
d5a0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
d5b0: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
d5c0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
d5d0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d5e0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d5f0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
d600: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
d610: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
d620: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
d630: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
d640: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
d650: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
d660: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
d670: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
d680: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
d690: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d6a0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d6b0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d6c0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d6d0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d6e0: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
d6f0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
d700: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d720: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d730: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d740: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
d750: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d760: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d770: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
d780: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
d790: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
d7a0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
d7b0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
d7c0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d7d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d7e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d7f0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
d800: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d810: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
d820: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
d830: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
d840: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
d850: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
d860: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
d870: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
d880: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
d890: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
d8a0: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
d8b0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
d8c0: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
d8d0: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
d8e0: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
d8f0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
d900: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
d910: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
d920: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
d930: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
d940: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
d950: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
d960: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d970: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
d980: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
d990: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
d9a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
d9b0: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
d9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
d9d0: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
d9e0: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
d9f0: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
da00: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
da10: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
da20: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
da30: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
da40: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
da50: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
da60: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
da70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
da80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
da90: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
daa0: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
dab0: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
dac0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
dad0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
dae0: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
daf0: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
db00: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
db10: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
db20: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
db30: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
db40: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
db50: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
db60: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
db70: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
db80: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
db90: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
dba0: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
dbb0: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
dbc0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
dbd0: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
dbe0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
dbf0: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
dc00: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
dc10: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
dc20: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dc30: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
dc40: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
dc50: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
dc60: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
dc70: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
dc80: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
dc90: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
dca0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
dcb0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
dcc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
dcd0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
dce0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
dcf0: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
dd00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
dd10: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
dd20: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
dd30: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
dd40: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  e);.#else.  if( 
dd50: 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
dd60: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dd70: 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
dd80: 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
dd90: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
dda0: 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
ddb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
ddc0: 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
ddd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ddf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
de00: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
de10: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
de20: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
de30: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
de40: 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
de50: 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
de60: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
de70: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
de80: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
de90: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
dec0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
ded0: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
dee0: 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
def0: 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
df00: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
df10: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
df40: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
df50: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
df60: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
df70: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
df80: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
df90: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
dfa0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
dfb0: 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
dfc0: 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
dfd0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
dfe0: 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
dff0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
e000: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
e010: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
e020: 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
e030: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
e040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
e050: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
e060: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
e070: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
e080: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
e090: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
e0a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
e0b0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
e0c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e0e0: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
e0f0: 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
e100: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
e110: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
e120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
e130: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
e140: 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
e150: 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e170: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
e180: 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
e190: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
e1c0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
e1d0: 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
e1e0: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
e1f0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
e200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e210: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e240: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
e250: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
e260: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
e270: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
e280: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
e290: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  ckpoint */..  /*
e2a0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e2b0: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
e2c0: 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
e2d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
e2e0: 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
e2f0: 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
e300: 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
e310: 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
e320: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
e330: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c  CKPOINT_FULL>SQL
e340: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
e350: 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  ASSIVE );.  asse
e360: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
e370: 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54  POINT_FULL<SQLIT
e380: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
e390: 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74  TART );.  assert
e3a0: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
e3b0: 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53  INT_PASSIVE+2==S
e3c0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e3d0: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66  _RESTART );.  if
e3e0: 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
e3f0: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
e400: 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
e410: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
e420: 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TART ){.    retu
e430: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e440: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
e450: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
e460: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
e470: 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
e480: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
e490: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
e4a0: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
e4b0: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
e4c0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
e4d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e4e0: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
e4f0: 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
e500: 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
e510: 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
e520: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e530: 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
e540: 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
e550: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
e560: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
e570: 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   rc);.  }.  rc =
e580: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e590: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
e5a0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e5b0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e5c0: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
e5d0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6b  ..int sqlite3_ck
e5e0: 70 74 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74  pt_open(.  sqlit
e5f0: 65 33 20 2a 64 62 2c 20 0a 20 20 75 6e 73 69 67  e3 *db, .  unsig
e600: 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 69 6e 74  ned char *a, int
e610: 20 6e 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63   n, .  sqlite3_c
e620: 6b 70 74 20 2a 2a 70 70 43 6b 70 74 0a 29 7b 0a  kpt **ppCkpt.){.
e630: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
e640: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
e650: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2a 70 70 43   int rc;..  *ppC
e660: 6b 70 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  kpt = 0;.  sqlit
e670: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
e680: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
e690: 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42   = db->aDb[0].pB
e6a0: 74 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  t;.  pPager = sq
e6b0: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
e6c0: 70 42 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pBt);.  rc = sql
e6d0: 69 74 65 33 50 61 67 65 72 57 61 6c 43 68 65 63  ite3PagerWalChec
e6e0: 6b 70 6f 69 6e 74 53 74 61 72 74 28 64 62 2c 20  kpointStart(db, 
e6f0: 70 50 61 67 65 72 2c 20 61 2c 20 6e 2c 20 70 70  pPager, a, n, pp
e700: 43 6b 70 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Ckpt);.  sqlite3
e710: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
e720: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
e730: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
e740: 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
e750: 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20  ase zDb. If zDb 
e760: 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74  is NULL, or if t
e770: 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f  he buffer zDb po
e780: 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61  ints.** to conta
e790: 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  ins a zero-lengt
e7a0: 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74  h string, all at
e7b0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
e7c0: 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f   are .** checkpo
e7d0: 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inted..*/.int sq
e7e0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
e7f0: 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
e800: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
e810: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b){.  return sql
e820: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
e830: 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  int_v2(db, zDb, 
e840: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
e850: 54 5f 50 41 53 53 49 56 45 2c 20 30 2c 20 30 29  T_PASSIVE, 0, 0)
e860: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
e870: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
e880: 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f  ** Run a checkpo
e890: 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  int on database 
e8a0: 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e  iDb. This is a n
e8b0: 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65  o-op if database
e8c0: 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63   iDb is.** not c
e8d0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e  urrently open in
e8e0: 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
e8f0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
e900: 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  n is open on the
e910: 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
e920: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68  checkpointed, th
e930: 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
e940: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  returns SQLITE_L
e950: 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63  OCKED and a chec
e960: 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74  kpoint is not at
e970: 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20  tempted. If .** 
e980: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
e990: 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68  while running th
e9a0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e  e checkpoint, an
e9b0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
e9c0: 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
e9d0: 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f  ed (i.e. SQLITE_
e9e0: 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73  IOERR). Otherwis
e9f0: 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
ea00: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e  .** The mutex on
ea10: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
ea20: 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65   db should be he
ea30: 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ld by the caller
ea40: 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61  . The mutex.** a
ea50: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
ea60: 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72  he specific b-tr
ea70: 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  ee being checkpo
ea80: 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62  inted is taken b
ea90: 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  y.** this functi
eaa0: 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65  on while the che
eab0: 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69  ckpoint is runni
eac0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ng..**.** If iDb
ead0: 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54   is passed SQLIT
eae0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20  E_MAX_ATTACHED, 
eaf0: 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  then all attache
eb00: 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a  d databases are.
eb10: 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
eb20: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
eb30: 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
eb40: 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
eb50: 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61  iately -.** no a
eb60: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
eb70: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79  o checkpoint any
eb80: 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62   remaining datab
eb90: 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ases..**.** Para
eba0: 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f  meter eMode is o
ebb0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45  ne of SQLITE_CHE
ebc0: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
ebd0: 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54   FULL or RESTART
ebe0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ebf0: 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  Checkpoint(sqlit
ec00: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
ec10: 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20   int eMode, int 
ec20: 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43  *pnLog, int *pnC
ec30: 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  kpt){.  int rc =
ec40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
ec50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
ec60: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
ec70: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
ec90: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
eca0: 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20  hrough attached 
ecb0: 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75  dbs */.  int bBu
ecc0: 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sy = 0;         
ecd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
ece0: 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
ecf0: 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  has been encount
ed00: 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ered */..  asser
ed10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ed20: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
ed30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
ed40: 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d  nLog || *pnLog==
ed50: 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -1 );.  assert( 
ed60: 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b  !pnCkpt || *pnCk
ed70: 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72  pt==-1 );..  for
ed80: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20  (i=0; i<db->nDb 
ed90: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
eda0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
edb0: 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53  i==iDb || iDb==S
edc0: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
edd0: 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ED ){.      rc =
ede0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65   sqlite3BtreeChe
edf0: 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  ckpoint(db->aDb[
ee00: 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70  i].pBt, eMode, p
ee10: 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
ee20: 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a       pnLog = 0;.
ee30: 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30        pnCkpt = 0
ee40: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
ee50: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
ee60: 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31         bBusy = 1
ee70: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
ee80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
ee90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
eea0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
eeb0: 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f  E_OK && bBusy) ?
eec0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72   SQLITE_BUSY : r
eed0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
eee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
eef0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
ef00: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
ef10: 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
ef20: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
ef30: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
ef40: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
ef50: 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
ef60: 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
ef70: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
ef80: 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
ef90: 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
efa0: 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
efb0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
efc0: 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
efd0: 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
efe0: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
eff0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
f000: 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
f010: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
f020: 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
f030: 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
f040: 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
f050: 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
f060: 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
f070: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
f080: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
f090: 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
f0a0: 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
f0b0: 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
f0c0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
f0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
f0e0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
f0f0: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
f100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f110: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
f130: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
f140: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
f150: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
f180: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
f190: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
f1c0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
f1d0: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
f1e0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
f1f0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
f200: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
f210: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
f220: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
f230: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
f250: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
f260: 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
f2a0: 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
f2d0: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
f2e0: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
f310: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
f320: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
f330: 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
f340: 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
f350: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
f360: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
f370: 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
f380: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
f390: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
f3a0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
f3b0: 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
f3c0: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
f3d0: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
f3e0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
f3f0: 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ==3.  return 1;.
f400: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
f410: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c  E_TEMP_STORE<1 |
f420: 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  | SQLITE_TEMP_ST
f430: 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30  ORE>3.  return 0
f440: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
f450: 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
f460: 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
f470: 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
f480: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
f490: 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
f4a0: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
f4b0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
f4c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
f4d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
f4e0: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
f4f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
f500: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
f510: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
f520: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f530: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
f540: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
f550: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
f560: 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
f570: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
f580: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f590: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
f5a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f5b0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
f5c0: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
f5d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f5e0: 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45  testcase( db->pE
f5f0: 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d  rr==0 );.    z =
f600: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
f610: 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
f620: 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
f630: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
f640: 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
f650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
f660: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
f670: 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
f680: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
f690: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f6a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f6b0: 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
f6c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
f6d0: 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
f6e0: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
f6f0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
f700: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
f710: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
f720: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
f730: 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
f740: 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
f750: 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
f760: 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
f770: 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
f780: 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
f790: 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
f7a0: 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
f7b0: 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
f7c0: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
f7d0: 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
f7e0: 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27  = {.    'l', 'i'
f7f0: 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'b', 'r', 'a',
f800: 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20   'r', 'y', ' ', 
f810: 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27  .    'r', 'o', '
f820: 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e  u', 't', 'i', 'n
f830: 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'e', ' ', .  
f840: 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c    'c', 'a', 'l',
f850: 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20   'l', 'e', 'd', 
f860: 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
f870: 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20  u', 't', ' ', . 
f880: 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27     'o', 'f', ' '
f890: 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c  , .    's', 'e',
f8a0: 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20   'q', 'u', 'e', 
f8b0: 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30  'n', 'c', 'e', 0
f8c0: 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
f8d0: 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
f8e0: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
f8f0: 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
f900: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
f910: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
f920: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
f930: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
f940: 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
f950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f960: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f970: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f980: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
f990: 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
f9a0: 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
f9b0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
f9c0: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
f9d0: 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
f9e0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f9f0: 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
fa00: 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20  b, db->errCode, 
fa10: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
fa20: 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20  ->errCode));.   
fa30: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
fa40: 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
fa50: 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
fa60: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
fa70: 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
fa80: 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
fa90: 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
faa0: 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
fab0: 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
fac0: 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
fad0: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
fae0: 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
faf0: 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
fb00: 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
fb10: 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
fb20: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
fb30: 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
fb40: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
fb50: 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
fb60: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
fb70: 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
fb80: 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
fb90: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
fba0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 0;.  }.  sql
fbb0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fbc0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
fbd0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
fbe0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fbf0: 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
fc00: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   Return the most
fc10: 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f   recent error co
fc20: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
fc30: 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e  an SQLite routin
fc40: 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a  e. If NULL is.**
fc50: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
fc60: 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73  function, we ass
fc70: 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  ume a malloc() f
fc80: 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c  ailed during sql
fc90: 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a  ite3_open()..*/.
fca0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63  int sqlite3_errc
fcb0: 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
fcc0: 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
fcd0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
fce0: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
fcf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fd00: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
fd10: 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
fd20: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
fd30: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
fd40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fd50: 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
fd60: 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72  rrCode & db->err
fd70: 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Mask;.}.int sqli
fd80: 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
fd90: 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
fda0: 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
fdb0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
fdc0: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
fdd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fde0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
fdf0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
fe00: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
fe10: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
fe20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fe30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
fe40: 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errCode;.}../*.*
fe50: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
fe60: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
fe70: 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
fe80: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
fe90: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
fea0: 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20    For now, this 
feb0: 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65  simply calls the
fec0: 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65   internal sqlite
fed0: 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e  3ErrStr().** fun
fee0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
fef0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
ff00: 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rstr(int rc){.  
ff10: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
ff20: 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  rStr(rc);.}../*.
ff30: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c  ** Invalidate al
ff40: 6c 20 63 61 63 68 65 64 20 4b 65 79 49 6e 66 6f  l cached KeyInfo
ff50: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 64 61 74   objects for dat
ff60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ff70: 20 22 64 62 22 0a 2a 2f 0a 73 74 61 74 69 63 20   "db".*/.static 
ff80: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43  void invalidateC
ff90: 61 63 68 65 64 4b 65 79 49 6e 66 6f 28 73 71 6c  achedKeyInfo(sql
ffa0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 44 62 20  ite3 *db){.  Db 
ffb0: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
ffc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
ffd0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  ngle database */
ffe0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10000 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
10010 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
10020 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10040 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
10050 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
10060 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
10090 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
100a0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
100b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
100c0 61 63 68 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ach index */..  
100d0 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
100e0 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
100f0 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
10100 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  +){.    if( pDb-
10110 3e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  >pBt==0 ) contin
10120 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ue;.    sqlite3B
10130 74 72 65 65 45 6e 74 65 72 28 70 44 62 2d 3e 70  treeEnter(pDb->p
10140 42 74 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  Bt);.    for(k=s
10150 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
10160 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
10170 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
10180 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
10190 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
101a0 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
101b0 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
101c0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
101d0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
101e0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
101f0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
10200 2d 3e 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 49  ->pKeyInfo && pI
10210 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  dx->pKeyInfo->db
10220 3d 3d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  ==db ){.        
10230 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
10240 55 6e 72 65 66 28 70 49 64 78 2d 3e 70 4b 65 79  Unref(pIdx->pKey
10250 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
10260 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20   pIdx->pKeyInfo 
10270 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
10280 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10290 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
102a0 76 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  ve(pDb->pBt);.  
102b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
102c0 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e  e a new collatin
102d0 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  g function for d
102e0 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54  atabase "db".  T
102f0 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65  he name is zName
10300 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f  .** and the enco
10310 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a  ding is enc..*/.
10320 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
10330 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  eCollation(.  sq
10340 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e  lite3* db,.  con
10350 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
10360 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69  .  u8 enc,.  voi
10370 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
10380 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
10390 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
103a0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
103b0 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
103c0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c  void*).){.  Coll
103d0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
103e0 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73  t enc2;.  .  ass
103f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10400 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
10410 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  x) );..  /* If S
10420 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
10430 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
10440 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
10450 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
10460 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
10470 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
10480 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
10490 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
104a0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
104b0 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
104c0 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
104d0 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
104e0 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20  .  enc2 = enc;. 
104f0 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
10500 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b  =SQLITE_UTF16 );
10510 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
10520 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
10530 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28  ALIGNED );.  if(
10540 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
10550 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c  F16 || enc2==SQL
10560 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
10570 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20  D ){.    enc2 = 
10580 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
10590 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e  VE;.  }.  if( en
105a0 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c2<SQLITE_UTF8 |
105b0 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54  | enc2>SQLITE_UT
105c0 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74  F16BE ){.    ret
105d0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
105e0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BKPT;.  }..  /
105f0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
10600 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67  call is removing
10610 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e   or replacing an
10620 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74   existing collat
10630 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ion .  ** sequen
10640 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74  ce. If so, and t
10650 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
10660 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79  VMs, return busy
10670 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  . If there.  ** 
10680 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
10690 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  s, invalidate an
106a0 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  y pre-compiled s
106b0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
106c0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
106d0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
106e0 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
106f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 0);.  if( pCol
10700 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
10710 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
10720 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20  nVdbeActive ){. 
10730 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10740 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
10750 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
10760 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
10770 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c  lete/modify coll
10780 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64  ation sequence d
10790 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
107a0 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
107b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
107c0 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
107d0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
107e0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
107f0 62 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  b);.    invalida
10800 74 65 43 61 63 68 65 64 4b 65 79 49 6e 66 6f 28  teCachedKeyInfo(
10810 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  db);..    /* If 
10820 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
10830 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65  ce pColl was cre
10840 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  ated directly by
10850 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a   a call to.    *
10860 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
10870 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20  _collation, and 
10880 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  not generated by
10890 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c   synthCollSeq(),
108a0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79  .    ** then any
108b0 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20   copies made by 
108c0 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e  synthCollSeq() n
108d0 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  eed to be invali
108e0 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  dated..    ** Al
108f0 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65  so, collation de
10900 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53  structor - CollS
10910 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63  eq.xDel() - func
10920 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20  tion may need.  
10930 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65    ** to be calle
10940 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69  d..    */ .    i
10950 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26  f( (pColl->enc &
10960 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
10970 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b  LIGNED)==enc2 ){
10980 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
10990 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  aColl = sqlite3H
109a0 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
109b0 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20  llSeq, zName);. 
109c0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
109d0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
109e0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
109f0 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
10a00 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
10a10 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
10a20 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
10a30 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
10a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
10a50 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
10a60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10a70 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
10a80 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
10a90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
10aa0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
10ab0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
10ac0 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
10ad0 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
10ae0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
10af0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43  LITE_NOMEM;.  pC
10b00 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
10b10 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70  pare;.  pColl->p
10b20 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70  User = pCtx;.  p
10b30 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
10b40 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  l;.  pColl->enc 
10b50 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
10b60 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
10b70 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73  6_ALIGNED));.  s
10b80 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
10b90 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65  SQLITE_OK);.  re
10ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10bb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  }.../*.** This a
10bc0 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72  rray defines har
10bd0 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f  d upper bounds o
10be0 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20  n limit values. 
10bf0 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   The.** initiali
10c00 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74  zer must be kept
10c10 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68   in sync with th
10c20 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a  e SQLITE_LIMIT_*
10c30 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20  .** #defines in 
10c40 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74  sqlite3.h..*/.st
10c50 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61  atic const int a
10c60 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a  HardLimit[] = {.
10c70 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e    SQLITE_MAX_LEN
10c80 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
10c90 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20  X_SQL_LENGTH,.  
10ca0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
10cb0 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  N,.  SQLITE_MAX_
10cc0 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51  EXPR_DEPTH,.  SQ
10cd0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
10ce0 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49  D_SELECT,.  SQLI
10cf0 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a  TE_MAX_VDBE_OP,.
10d00 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e    SQLITE_MAX_FUN
10d10 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c  CTION_ARG,.  SQL
10d20 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
10d30 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ,.  SQLITE_MAX_L
10d40 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
10d50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
10d60 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
10d70 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ,      /* IMP: R
10d80 2d 33 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a  -38091-32352 */.
10d90 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49    SQLITE_MAX_TRI
10da0 47 47 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51  GGER_DEPTH,.  SQ
10db0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
10dc0 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a  THREADS,.};../*.
10dd0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
10de0 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65   hard limits are
10df0 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62   set to reasonab
10e00 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66  le values.*/.#if
10e10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
10e20 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
10e30 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
10e40 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
10e50 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
10e60 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
10e70 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
10e80 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
10e90 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  L_LENGTH must be
10ea0 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
10eb0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
10ec0 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53  MAX_SQL_LENGTH>S
10ed0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
10ee0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10ef0 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
10f00 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74  ust not be great
10f10 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d  er than SQLITE_M
10f20 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66  AX_LENGTH.#endif
10f30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10f40 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c  COMPOUND_SELECT<
10f50 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  2.# error SQLITE
10f60 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
10f70 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74 20  LECT must be at 
10f80 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23  least 2.#endif.#
10f90 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  if SQLITE_MAX_VD
10fa0 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72  BE_OP<40.# error
10fb0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
10fc0 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c  _OP must be at l
10fd0 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23  east 40.#endif.#
10fe0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  if SQLITE_MAX_FU
10ff0 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20  NCTION_ARG<0 || 
11000 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
11010 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20 65  ION_ARG>1000.# e
11020 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
11030 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73  FUNCTION_ARG mus
11040 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
11050 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 23  nd 1000.#endif.#
11060 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  if SQLITE_MAX_AT
11070 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49  TACHED<0 || SQLI
11080 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e  TE_MAX_ATTACHED>
11090 31 32 35 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  125.# error SQLI
110a0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
110b0 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
110c0 30 20 61 6e 64 20 31 32 35 0a 23 65 6e 64 69 66  0 and 125.#endif
110d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
110e0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
110f0 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  GTH<1.# error SQ
11100 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
11110 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73  TTERN_LENGTH mus
11120 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
11130 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
11140 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37  E_MAX_COLUMN>327
11150 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  67.# error SQLIT
11160 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73  E_MAX_COLUMN mus
11170 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37  t not exceed 327
11180 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  67.#endif.#if SQ
11190 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
111a0 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72  _DEPTH<1.# error
111b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
111c0 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62  GER_DEPTH must b
111d0 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
111e0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
111f0 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
11200 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  S<0 || SQLITE_MA
11210 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
11220 3e 35 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  >50.# error SQLI
11230 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
11240 52 45 41 44 53 20 6d 75 73 74 20 62 65 20 62 65  READS must be be
11250 74 77 65 65 6e 20 30 20 61 6e 64 20 35 30 0a 23  tween 0 and 50.#
11260 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
11270 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
11280 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f  f a limit.  Repo
11290 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
112a0 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c  ..** If an inval
112b0 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69  id limit index i
112c0 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f  s supplied, repo
112d0 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e  rt -1..** Make n
112e0 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74  o changes but st
112f0 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f  ill report the o
11300 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a  ld value if the.
11310 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20  ** new limit is 
11320 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
11330 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69  A new lower limi
11340 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e  t does not shrin
11350 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74  k existing const
11360 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72  ructs..** It mer
11370 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ely prevents new
11380 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74   constructs that
11390 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69   exceed the limi
113a0 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e  t.** from formin
113b0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
113c0 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20  3_limit(sqlite3 
113d0 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64  *db, int limitId
113e0 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b  , int newLimit){
113f0 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b  .  int oldLimit;
11400 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ...  /* EVIDENCE
11410 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
11420 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
11430 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
11440 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
11450 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
11460 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
11470 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
11480 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
11490 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
114a0 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
114b0 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
114c0 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
114d0 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
114e0 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
114f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11500 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11510 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
11520 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
11530 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
11540 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11550 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
11560 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
11570 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
11580 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
11590 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
115a0 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
115b0 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
115c0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
115d0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
115e0 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
115f0 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
11600 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
11610 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11620 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
11630 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
11640 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
11650 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
11660 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
11670 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
11680 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
11690 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
116a0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
116b0 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
116c0 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
116d0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
116e0 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
116f0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
11700 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
11710 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
11720 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
11730 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
11740 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
11750 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
11760 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
117a0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
117b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
117c0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
117d0 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
117e0 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
117f0 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
11800 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
11810 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
11820 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
11830 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
11840 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
11850 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
11860 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
11870 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
11880 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  DS]==SQLITE_MAX_
11890 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29  WORKER_THREADS )
118a0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
118b0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
118c0 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45  THREADS==(SQLITE
118d0 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a  _N_LIMIT-1) );..
118e0 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30  .  if( limitId<0
118f0 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c   || limitId>=SQL
11900 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20  ITE_N_LIMIT ){. 
11910 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
11920 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64  }.  oldLimit = d
11930 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
11940 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d  d];.  if( newLim
11950 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20  it>=0 ){        
11960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d             /* IM
11970 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32  P: R-52476-28732
11980 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c   */.    if( newL
11990 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b  imit>aHardLimit[
119a0 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20  limitId] ){.    
119b0 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61    newLimit = aHa
119c0 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
119d0 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34  ;  /* IMP: R-514
119e0 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20  63-25634 */.    
119f0 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74  }.    db->aLimit
11a00 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c  [limitId] = newL
11a10 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
11a20 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20  rn oldLimit;    
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31   /* IMP: R-53341
11a50 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  -35419 */.}../*.
11a60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11a70 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73   is used to pars
11a80 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20  e both URIs and 
11a90 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
11aa0 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a  s passed by the.
11ab0 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66  ** user to API f
11ac0 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33  unctions sqlite3
11ad0 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
11ae0 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e  e3_open_v2(), an
11af0 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a  d for database.*
11b00 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64  * URIs specified
11b10 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41   as part of ATTA
11b20 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CH statements..*
11b30 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
11b40 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
11b50 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
11b60 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
11b70 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20  to use (or.** a 
11b80 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20  NULL to signify 
11b90 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29  the default VFS)
11ba0 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73   if the URI does
11bb0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22   not contain a "
11bc0 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72  vfs=xxx".** quer
11bd0 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65  y parameter. The
11be0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
11bf0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52   contains the UR
11c00 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69  I (or non-URI fi
11c10 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c  lename).** itsel
11c20 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  f. When this fun
11c30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
11c40 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69  the *pFlags vari
11c50 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74  able should cont
11c60 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  ain.** the defau
11c70 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  lt flags to open
11c80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
11c90 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76  ndle with. The v
11ca0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
11cb0 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65  * *pFlags may be
11cc0 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20   updated before 
11cd0 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65  returning if the
11ce0 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f   URI filename co
11cf0 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68  ntains .** "cach
11d00 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d  e=xxx" or "mode=
11d10 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d  xxx" query param
11d20 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eters..**.** If 
11d30 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
11d40 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
11d50 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
11d60 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f  *ppVfs is set to
11d70 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
11d80 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64   VFS that should
11d90 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e   be used to open
11da0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11db0 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73  le. *pzFile is s
11dc0 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  et to.** point t
11dd0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
11de0 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  ining the name o
11df0 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70  f the file to op
11e00 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  en. It is the .*
11e10 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
11e20 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
11e30 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c  o eventually cal
11e40 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
11e50 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74   to release.** t
11e60 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  his buffer..**.*
11e70 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
11e80 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51  curs, then an SQ
11e90 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
11ea0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
11eb0 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79  *pzErrMsg.** may
11ec0 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
11ed0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
11ee0 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69  taining an Engli
11ef0 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
11f00 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49  r .** message. I
11f10 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
11f20 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
11f30 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
11f40 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  lly release.** t
11f50 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61  his buffer by ca
11f60 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
11f70 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ee()..*/.int sql
11f80 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20  ite3ParseUri(.  
11f90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66  const char *zDef
11fa0 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20  aultVfs,        
11fb0 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66  /* VFS to use if
11fc0 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75   no "vfs=xxx" qu
11fd0 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ery option */.  
11fe0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
11ff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12000 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
12010 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a  d URI to parse *
12020 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
12030 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20   *pFlags,       
12040 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
12050 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
12060 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
12070 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20  3_vfs **ppVfs,  
12080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
12090 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20  : VFS to use */ 
120a0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65  .  char **pzFile
120b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
120c0 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e     /* OUT: Filen
120d0 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ame component of
120e0 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a   URI */.  char *
120f0 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20  *pzErrMsg       
12100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
12110 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  : Error message 
12120 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (if rc!=SQLITE_O
12130 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  K) */.){.  int r
12140 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12150 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
12160 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20  ags = *pFlags;. 
12170 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
12180 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b  s = zDefaultVfs;
12190 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
121a0 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20    char c;.  int 
121b0 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nUri = sqlite3St
121c0 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20  rlen30(zUri);.. 
121d0 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d   assert( *pzErrM
121e0 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  sg==0 );..  if( 
121f0 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
12200 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71  _OPEN_URI) || sq
12210 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12220 67 2e 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20  g.bOpenUri) .   
12230 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65  && nUri>=5 && me
12240 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65  mcmp(zUri, "file
12250 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50  :", 5)==0 /* IMP
12260 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20  : R-57884-37496 
12270 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  */.  ){.    char
12280 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20   *zOpt;.    int 
12290 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
122a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
122b0 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70  ser state when p
122c0 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20  arsing URI */.  
122d0 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20    int iIn;      
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74  /* Input charact
12300 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
12310 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12330 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65   Output characte
12340 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
12350 6e 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b  nt nByte = nUri+
12360 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
12370 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
12380 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
12390 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
123a0 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
123b0 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20  URI flag is set 
123c0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74  to indicate to t
123d0 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20  he VFS xOpen .  
123e0 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74    ** method that
123f0 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78   there may be ex
12400 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66  tra parameters f
12410 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c  ollowing the fil
12420 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e-name.  */.    
12430 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
12440 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66  OPEN_URI;..    f
12450 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55  or(iIn=0; iIn<nU
12460 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65  ri; iIn++) nByte
12470 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d   += (zUri[iIn]==
12480 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  '&');.    zFile 
12490 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
124a0 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
124b0 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
124c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
124d0 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66      iIn = 5;.#if
124e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  ndef SQLITE_ALLO
124f0 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a  W_URI_AUTHORITY.
12500 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
12510 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75  he scheme and au
12520 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73  thority segments
12530 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a   of the URI. */.
12540 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d      if( zUri[5]=
12550 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d  ='/' && zUri[6]=
12560 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='/' ){.      iI
12570 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69  n = 7;.      whi
12580 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
12590 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20   zUri[iIn]!='/' 
125a0 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69  ) iIn++;.      i
125b0 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49  f( iIn!=7 && (iI
125c0 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28  n!=16 || memcmp(
125d0 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55  "localhost", &zU
125e0 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20  ri[7], 9)) ){.  
125f0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
12600 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
12610 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61  f("invalid uri a
12620 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c  uthority: %.*s",
12630 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49   .            iI
12640 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a  n-7, &zUri[7]);.
12650 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12660 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
12670 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
12680 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  i_out;.      }. 
12690 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
126a0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c   /* Copy the fil
126b0 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75  ename and any qu
126c0 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69  ery parameters i
126d0 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75  nto the zFile bu
126e0 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65  ffer. .    ** De
126f0 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20  code %HH escape 
12700 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20  codes along the 
12710 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  way. .    **.   
12720 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20   ** Within this 
12730 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65  loop, variable e
12740 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74  State may be set
12750 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64   to 0, 1 or 2, d
12760 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
12770 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63  on the parsing c
12780 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f  ontext. As follo
12790 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
127a0 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66  *   0: Parsing f
127b0 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a  ile-name..    **
127c0 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61     1: Parsing na
127d0 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  me section of a 
127e0 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
127f0 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
12800 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20  **   2: Parsing 
12810 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66  value section of
12820 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
12830 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
12840 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65     */.    eState
12850 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
12860 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
12870 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b  !=0 && c!='#' ){
12880 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
12890 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a      if( c=='%' .
128a0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
128b0 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
128c0 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20  In]) .       && 
128d0 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
128e0 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20  zUri[iIn+1]) .  
128f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
12900 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69  nt octet = (sqli
12910 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
12920 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a  [iIn++]) << 4);.
12930 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d          octet +=
12940 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
12950 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a  (zUri[iIn++]);..
12960 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12970 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65  octet>=0 && octe
12980 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20  t<256 );.       
12990 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b   if( octet==0 ){
129a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
129b0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
129c0 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70  en when "%00" ap
129d0 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65  pears within the
129e0 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20   URI. In this.  
129f0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
12a00 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65  we ignore all te
12a10 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  xt in the remain
12a20 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c  der of the path,
12a30 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20   name or.       
12a40 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72     ** value curr
12a50 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73  ently being pars
12a60 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  ed. So ignore th
12a70 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63  e current charac
12a80 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ter.          **
12a90 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65   and skip to the
12aa0 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f   next "?", "=" o
12ab0 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70  r "&", as approp
12ac0 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  riate. */.      
12ad0 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
12ae0 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
12af0 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20   c!='#' .       
12b00 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
12b10 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a  e!=0 || c!='?').
12b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
12b30 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28   (eState!=1 || (
12b40 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27  c!='=' && c!='&'
12b50 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
12b60 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c   && (eState!=2 |
12b70 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20  | c!='&').      
12b80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
12b90 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
12ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12bb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
12bd0 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c  octet;.      }el
12be0 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31  se if( eState==1
12bf0 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63   && (c=='&' || c
12c00 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  =='=') ){.      
12c10 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74    if( zFile[iOut
12c20 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1]==0 ){.      
12c30 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20      /* An empty 
12c40 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e  option name. Ign
12c50 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ore this option 
12c60 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20  altogether. */. 
12c70 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12c80 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
12c90 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a  i[iIn]!='#' && z
12ca0 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20  Uri[iIn-1]!='&' 
12cb0 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ) iIn++;.       
12cc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12ce0 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20  f( c=='&' ){.   
12cf0 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75         zFile[iOu
12d00 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
12d10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12d20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32        eState = 2
12d30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12d40 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
12d50 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61   }else if( (eSta
12d60 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29  te==0 && c=='?')
12d70 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26   || (eState==2 &
12d80 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20  & c=='&') ){.   
12d90 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
12da0 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a      eState = 1;.
12db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
12dc0 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b  ile[iOut++] = c;
12dd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
12de0 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65  State==1 ) zFile
12df0 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
12e00 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
12e10 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
12e20 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
12e30 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  \0';..    /* Che
12e40 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ck if there were
12e50 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65   any options spe
12e60 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75  cified that shou
12e70 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  ld be interprete
12e80 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20  d .    ** here. 
12e90 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  Options that are
12ea0 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72   interpreted her
12eb0 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20  e include "vfs" 
12ec0 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20  and those that. 
12ed0 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
12ee0 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d   to flags that m
12ef0 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ay be passed to 
12f00 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  the sqlite3_open
12f10 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74  _v2().    ** met
12f20 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74  hod. */.    zOpt
12f30 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65   = &zFile[sqlite
12f40 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
12f50 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
12f60 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zOpt[0] ){.     
12f70 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69   int nOpt = sqli
12f80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
12f90 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
12fa0 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74  Val = &zOpt[nOpt
12fb0 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  +1];.      int n
12fc0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Val = sqlite3Str
12fd0 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20  len30(zVal);..  
12fe0 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20      if( nOpt==3 
12ff0 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c  && memcmp("vfs",
13000 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a   zOpt, 3)==0 ){.
13010 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a          zVfs = z
13020 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Val;.      }else
13030 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
13040 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20   OpenMode {.    
13050 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13060 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69   *z;.          i
13070 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  nt mode;.       
13080 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20   } *aMode = 0;. 
13090 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f         char *zMo
130a0 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  deType = 0;.    
130b0 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30      int mask = 0
130c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69  ;.        int li
130d0 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  mit = 0;..      
130e0 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26    if( nOpt==5 &&
130f0 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c   memcmp("cache",
13100 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a   zOpt, 5)==0 ){.
13110 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
13120 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
13130 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20   aCacheMode[] = 
13140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
13150 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54  "shared",  SQLIT
13160 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
13170 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
13180 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53    { "private", S
13190 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
131a0 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  TECACHE },.     
131b0 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
131c0 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
131d0 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
131e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
131f0 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50  DCACHE|SQLITE_OP
13200 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b  EN_PRIVATECACHE;
13210 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
13220 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20   = aCacheMode;. 
13230 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
13240 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20   mask;.         
13250 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61   zModeType = "ca
13260 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  che";.        }.
13270 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
13280 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d  ==4 && memcmp("m
13290 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d  ode", zOpt, 4)==
132a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
132b0 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
132c0 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b  nMode aOpenMode[
132d0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
132e0 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54    { "ro",  SQLIT
132f0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
13300 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
13310 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "rw",  SQLITE_O
13320 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c  PEN_READWRITE },
13330 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
13340 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50  "rwc", SQLITE_OP
13350 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
13360 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13370 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
13380 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c   { "memory", SQL
13390 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20  ITE_OPEN_MEMORY 
133a0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
133b0 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
133c0 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
133d0 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
133e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51  EN_READONLY | SQ
133f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13400 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ITE.            
13410 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
13420 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
13430 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
13440 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
13450 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20  e = aOpenMode;. 
13460 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
13470 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20   mask & flags;. 
13480 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
13490 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20  pe = "access";. 
134a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
134b0 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20    if( aMode ){. 
134c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
134d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
134e0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
134f0 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65    for(i=0; aMode
13500 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20  [i].z; i++){.   
13510 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
13520 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69  har *z = aMode[i
13530 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ].z;.           
13540 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74   if( nVal==sqlit
13550 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26  e3Strlen30(z) &&
13560 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c   0==memcmp(zVal,
13570 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20   z, nVal) ){.   
13580 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20             mode 
13590 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b  = aMode[i].mode;
135a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
135b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
135c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
135d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f            if( mo
135e0 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
135f0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
13600 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
13610 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64  ("no such %s mod
13620 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70  e: %s", zModeTyp
13630 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
13640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13650 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
13660 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
13670 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
13680 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
13690 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49  f( (mode & ~SQLI
136a0 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e  TE_OPEN_MEMORY)>
136b0 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  limit ){.       
136c0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
136d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
136e0 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c  ("%s mode not al
136f0 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20  lowed: %s",.    
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a      zModeType, z
13730 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
13740 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45    rc = SQLITE_PE
13750 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RM;.            
13760 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
13770 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
13780 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
13790 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b  = (flags & ~mask
137a0 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  ) | mode;.      
137b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
137c0 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b     zOpt = &zVal[
137d0 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a  nVal+1];.    }..
137e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69    }else{.    zFi
137f0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
13800 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20  loc(nUri+2);.   
13810 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
13820 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13830 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  M;.    memcpy(zF
13840 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
13850 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
13860 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
13870 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c  ile[nUri+1] = '\
13880 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  0';.    flags &=
13890 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
138a0 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73  I;.  }..  *ppVfs
138b0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
138c0 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
138d0 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20   *ppVfs==0 ){.  
138e0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
138f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
13900 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
13910 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d   zVfs);.    rc =
13920 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13930 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75   }. parse_uri_ou
13940 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
13950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
13960 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
13970 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30  );.    zFile = 0
13980 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20  ;.  }.  *pFlags 
13990 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69  = flags;.  *pzFi
139a0 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65  le = zFile;.  re
139b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
139c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
139d0 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
139e0 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62   opening a datab
139f0 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66  ase on behalf of
13a00 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
13a10 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f  () and sqlite3_o
13a20 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74  pen16(). The dat
13a30 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22  abase filename "
13a40 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20  zFilename"  .** 
13a50 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  is UTF-8 encoded
13a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a70 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20  openDatabase(.  
13a80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
13a90 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61  ename, /* Databa
13aa0 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d  se filename UTF-
13ab0 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73  8 encoded */.  s
13ac0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
13ad0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
13ae0 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20  turned database 
13af0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  handle */.  unsi
13b00 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20  gned int flags, 
13b10 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61     /* Operationa
13b20 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  l flags */.  con
13b30 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
13b40 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
13b50 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  he VFS to use */
13b60 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
13b70 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
13b80 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61        /* Store a
13b90 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20  llocated handle 
13ba0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
13bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
13bd0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
13be0 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20  t isThreadsafe; 
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c00 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64   True for thread
13c10 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  safe connections
13c20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65   */.  char *zOpe
13c30 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
13c40 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
13c50 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  e argument to pa
13c60 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28  ss to BtreeOpen(
13c70 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  ) */.  char *zEr
13c80 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rMsg = 0;       
13c90 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
13ca0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c  message from sql
13cb0 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a  ite3ParseUri() *
13cc0 2f 0a 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  /..  *ppDb = 0;.
13cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13ce0 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
13cf0 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
13d00 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
13d10 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13d20 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c  #endif..  /* Onl
13d30 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65  y allow sensible
13d40 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
13d50 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61   bits in the fla
13d60 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20  gs argument.  . 
13d70 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72   ** Throw an err
13d80 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65  or if any non-se
13d90 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  nse combination 
13da0 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a  is used.  If we.
13db0 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63    ** do not bloc
13dc0 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e  k illegal combin
13dd0 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20  ations here, it 
13de0 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20  could trigger.  
13df0 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ** assert() stat
13e00 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72  ements in deeper
13e10 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62   layers.  Sensib
13e20 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a  le combinations.
13e30 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20    ** are:.  **. 
13e40 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f   **  1:  SQLITE_
13e50 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  OPEN_READONLY.  
13e60 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f  **  2:  SQLITE_O
13e70 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
13e80 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f  **  6:  SQLITE_O
13e90 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
13ea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
13eb0 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  TE.  */.  assert
13ec0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
13ed0 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20  ADONLY  == 0x01 
13ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
13ef0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13f00 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20  TE == 0x02 );.  
13f10 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
13f20 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d  PEN_CREATE    ==
13f30 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63   0x04 );.  testc
13f40 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
13f50 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20  7))==0x02 ); /* 
13f60 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65  READONLY */.  te
13f70 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
13f80 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20  gs&7))==0x04 ); 
13f90 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a  /* READWRITE */.
13fa0 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
13fb0 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30  (flags&7))==0x40
13fc0 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
13fd0 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69   | CREATE */.  i
13fe0 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37  f( ((1<<(flags&7
13ff0 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b  )) & 0x46)==0 ){
14000 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14010 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20  TE_MISUSE_BKPT; 
14020 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37   /* IMP: R-65497
14030 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20  -44594 */.  }.. 
14040 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
14050 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
14060 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
14070 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
14080 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
14090 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
140a0 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
140b0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
140c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
140d0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
140e0 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
140f0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
14100 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
14110 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
14120 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14130 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
14140 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
14150 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  & SQLITE_OPEN_PR
14160 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20  IVATECACHE ){.  
14170 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
14180 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
14190 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CHE;.  }else if(
141a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
141b0 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
141c0 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66  Enabled ){.    f
141d0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
141e0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
141f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
14200 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66  e harmful bits f
14210 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61  rom the flags pa
14220 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a  rameter.  **.  *
14230 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  * The SQLITE_OPE
14240 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51  N_NOMUTEX and SQ
14250 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
14260 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20  TEX flags were. 
14270 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69   ** dealt with i
14280 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
14290 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69  ode block.  Besi
142a0 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f  des these, the o
142b0 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69  nly.  ** valid i
142c0 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73  nput flags for s
142d0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
142e0 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   are SQLITE_OPEN
142f0 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20  _READONLY,.  ** 
14300 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
14310 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  WRITE, SQLITE_OP
14320 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54  EN_CREATE, SQLIT
14330 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
14340 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  HE,.  ** SQLITE_
14350 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
14360 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65  E, and some rese
14370 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65  rved bits.  Sile
14380 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
14390 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
143a0 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
143b0 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
143c0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
143d0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
143e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
143f0 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
14400 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
14410 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
14430 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
14440 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
14450 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
14460 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
14470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
14490 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
144a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
144b0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
144c0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
144d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
144e0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
14500 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
14510 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
14520 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
14530 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
14540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14550 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
14560 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
14570 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
14580 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
14590 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
145a0 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
145b0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
145c0 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
145d0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
145e0 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
145f0 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
14600 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
14610 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
14620 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74  e ){.    db->mut
14630 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
14640 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
14650 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
14660 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65      if( db->mute
14670 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x==0 ){.      sq
14680 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
14690 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20        db = 0;.  
146a0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
146b0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
146c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
146d0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
146e0 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
146f0 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62   0xff;.  db->nDb
14700 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69   = 2;.  db->magi
14710 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
14720 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62  _BUSY;.  db->aDb
14730 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
14740 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ;..  assert( siz
14750 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d  eof(db->aLimit)=
14760 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d  =sizeof(aHardLim
14770 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  it) );.  memcpy(
14780 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72  db->aLimit, aHar
14790 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64  dLimit, sizeof(d
147a0 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64  b->aLimit));.  d
147b0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
147c0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
147d0 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f  READS] = SQLITE_
147e0 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54  DEFAULT_WORKER_T
147f0 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75  HREADS;.  db->au
14800 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
14810 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
14820 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d  = -1;.  db->szMm
14830 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ap = sqlite3Glob
14840 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
14850 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  .  db->nextPages
14860 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  ize = 0;.  db->n
14870 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
14880 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62  0x7FFFFFFF;.  db
14890 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
148a0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20  E_ShortColNames 
148b0 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
148c0 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f  rigger | SQLITE_
148d0 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21  CacheSpill.#if !
148e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
148f0 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
14900 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54  _INDEX) || SQLIT
14910 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
14920 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20  TIC_INDEX.      
14930 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
14940 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65  ITE_AutoIndex.#e
14950 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
14960 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
14970 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
14980 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
14990 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
149a0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
149b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
149c0 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
149d0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
149e0 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
149f0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
14a00 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
14a10 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
14a30 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
14a40 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
14a50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14a60 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
14a70 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
14a80 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
14a90 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
14aa0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
14ab0 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
14ac0 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65        ;.  sqlite
14ad0 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
14ae0 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
14af0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
14b00 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
14b10 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
14b20 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
14b30 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
14b40 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
14b50 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
14b60 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
14b70 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
14b80 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
14b90 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
14ba0 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
14bb0 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
14bc0 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
14bd0 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
14be0 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
14bf0 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
14c00 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
14c10 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
14c20 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
14c30 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
14c40 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
14c50 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
14c60 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
14c70 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
14c80 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16BE, 0, binColl
14c90 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
14ca0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
14cb0 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
14cc0 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e  _UTF16LE, 0, bin
14cd0 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
14ce0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
14cf0 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
14d00 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
14d10 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
14d20 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
14d30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14d40 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
14d50 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44  ut;.  }.  db->pD
14d60 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
14d70 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
14d80 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42   SQLITE_UTF8, "B
14d90 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73  INARY", 0);.  as
14da0 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43  sert( db->pDfltC
14db0 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  oll!=0 );..  /* 
14dc0 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38  Also add a UTF-8
14dd0 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76   case-insensitiv
14de0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
14df0 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74  ence. */.  creat
14e00 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
14e10 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
14e20 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
14e30 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
14e40 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
14e50 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61  e filename/URI a
14e60 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62  rgument. */.  db
14e70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
14e80 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ags;.  rc = sqli
14e90 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73  te3ParseUri(zVfs
14ea0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c  , zFilename, &fl
14eb0 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20  ags, &db->pVfs, 
14ec0 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67  &zOpen, &zErrMsg
14ed0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14ee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
14ef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
14f00 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EM ) db->mallocF
14f10 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73  ailed = 1;.    s
14f20 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
14f30 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d  sg(db, rc, zErrM
14f40 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a  sg ? "%s" : 0, z
14f50 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
14f60 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
14f70 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  g);.    goto ope
14f80 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
14f90 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b  /* Open the back
14fa0 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69  end database dri
14fb0 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ver */.  rc = sq
14fc0 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
14fd0 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20  b->pVfs, zOpen, 
14fe0 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e  db, &db->aDb[0].
14ff0 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBt, 0,.        
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
15020 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20  PEN_MAIN_DB);.  
15030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15040 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
15050 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
15060 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  MEM ){.      rc 
15070 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
15080 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15090 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
150a0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
150b0 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61  out;.  }.  db->a
150c0 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
150d0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
150e0 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
150f0 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
15100 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  1].pSchema = sql
15110 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
15120 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  , 0);..  /* The 
15130 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c  default safety_l
15140 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69  evel for the mai
15150 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66  n database is 'f
15160 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65  ull'; for the te
15170 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  mp.  ** database
15180 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54   it is 'NONE'. T
15190 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
151a0 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61  pager layer defa
151b0 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64  ults.  .  */.  d
151c0 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20  b->aDb[0].zName 
151d0 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e  = "main";.  db->
151e0 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[0].safety_le
151f0 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61  vel = 3;.  db->a
15200 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74  Db[1].zName = "t
15210 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  emp";.  db->aDb[
15220 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  1].safety_level 
15230 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  = 1;..  db->magi
15240 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
15250 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d  _OPEN;.  if( db-
15260 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
15270 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
15280 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
15290 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69  Register all bui
152a0 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c  lt-in functions,
152b0 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65   but do not atte
152c0 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a  mpt to read the.
152d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63    ** database sc
152e0 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69  hema yet. This i
152f0 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  s delayed until 
15300 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
15310 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
15320 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20   is accessed..  
15330 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  */.  sqlite3Erro
15340 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
15350 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  ;.  sqlite3Regis
15360 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
15370 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ons(db);..  /* L
15380 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78  oad automatic ex
15390 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e  tensions - exten
153a0 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  sions that have 
153b0 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a  been registered.
153c0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73    ** using the s
153d0 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63  qlite3_automatic
153e0 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49  _extension() API
153f0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
15400 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
15410 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
15420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
15430 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74  lite3AutoLoadExt
15440 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20  ensions(db);.   
15450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
15460 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69  rcode(db);.    i
15470 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15480 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   ){.      goto o
15490 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
154a0 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
154b0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
154c0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
154d0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
154e0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
154f0 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
15500 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
15510 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
15520 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
15530 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15540 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
15550 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15560 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
15570 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
15580 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
15590 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
155a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
155b0 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
155c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
155d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
155e0 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S3.  if( !db->ma
155f0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
15600 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15610 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
15620 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
15630 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
15640 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
15650 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
15660 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
15670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
15690 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
156a0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
156b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
156c0 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
156d0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
156e0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
156f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
15700 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
15710 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53  #endif..  /* -DS
15720 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
15730 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
15740 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
15750 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
15760 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
15770 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
15780 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
15790 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
157a0 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
157b0 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
157c0 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
157d0 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
157e0 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
157f0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15800 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
15810 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
15820 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
15830 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
15840 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
15850 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
15860 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
15870 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
15880 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
158a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
158b0 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
158c0 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73  if..  if( rc ) s
158d0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
158e0 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c  rc);..  /* Enabl
158f0 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
15900 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
15910 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61   */.  setupLooka
15920 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69  side(db, 0, sqli
15930 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15940 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20  szLookaside,.   
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
15970 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
15980 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ide);..  sqlite3
15990 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
159a0 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  int(db, SQLITE_D
159b0 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
159c0 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65  HECKPOINT);..ope
159d0 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ndb_out:.  sqlit
159e0 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a  e3_free(zOpen);.
159f0 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
15a00 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65  assert( db->mute
15a10 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64  x!=0 || isThread
15a20 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  safe==0 || sqlit
15a30 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
15a40 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  FullMutex==0 );.
15a50 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15a60 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
15a70 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  x);.  }.  rc = s
15a80 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
15a90 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
15aa0 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
15ab0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28  E_NOMEM );.  if(
15ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
15ad0 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
15ae0 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
15af0 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  db = 0;.  }else 
15b00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15b10 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  K ){.    db->mag
15b20 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
15b30 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70  C_SICK;.  }.  *p
15b40 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66  pDb = db;.#ifdef
15b50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15b60 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
15b70 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15b80 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
15b90 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68  * Opening a db h
15ba0 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
15bb0 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
15bc0 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  d 0. */.    void
15bd0 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33   *pArg = sqlite3
15be0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
15bf0 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c  llogArg;.    sql
15c00 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15c10 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64  .xSqllog(pArg, d
15c20 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  b, zFilename, 0)
15c30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
15c40 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69  eturn sqlite3Api
15c50 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a  Exit(0, rc);.}..
15c60 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
15c70 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15c80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15c90 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
15ca0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
15cb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
15cc0 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  b .){.  return o
15cd0 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
15ce0 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20  ename, ppDb,.   
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
15d10 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
15d20 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
15d30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
15d40 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73  _open_v2(.  cons
15d50 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
15d60 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ,   /* Database 
15d70 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29  filename (UTF-8)
15d80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
15d90 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  ppDb,         /*
15da0 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20   OUT: SQLite db 
15db0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
15dc0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
15dd0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
15de0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
15df0 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  fs        /* Nam
15e00 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20  e of VFS module 
15e10 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72  to use */.){.  r
15e20 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
15e30 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44  se(filename, ppD
15e40 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  b, (unsigned int
15e50 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d  )flags, zVfs);.}
15e60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15e70 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
15e80 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
15e90 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
15ea0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
15eb0 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69  n16(.  const voi
15ec0 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  d *zFilename, . 
15ed0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a   sqlite3 **ppDb.
15ee0 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
15ef0 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f  *zFilename8;   /
15f00 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f  * zFilename enco
15f10 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73  ded in UTF-8 ins
15f20 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a  tead of UTF-16 *
15f30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
15f40 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
15f50 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46  c;..  assert( zF
15f60 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73  ilename );.  ass
15f70 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a  ert( ppDb );.  *
15f80 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
15f90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15fa0 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
15fb0 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
15fc0 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
15fd0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
15fe0 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
15ff0 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
16000 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
16010 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69  tr(pVal, -1, zFi
16020 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  lename, SQLITE_U
16030 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
16040 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46  TE_STATIC);.  zF
16050 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74  ilename8 = sqlit
16060 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
16070 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
16080 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38    if( zFilename8
16090 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
160a0 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
160b0 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20  ame8, ppDb,.    
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
160e0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
160f0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
16100 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
16110 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  pDb || rc==SQLIT
16120 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69  E_NOMEM );.    i
16130 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16140 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72   && !DbHasProper
16150 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f  ty(*ppDb, 0, DB_
16160 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b  SchemaLoaded) ){
16170 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70 44 62  .      ENC(*ppDb
16180 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ) = SQLITE_UTF16
16190 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20  NATIVE;.    }.  
161a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
161b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
161c0 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  }.  sqlite3Value
161d0 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
161e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69  eturn sqlite3Api
161f0 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23  Exit(0, rc);.}.#
16200 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16210 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
16220 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
16230 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
16240 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
16250 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16260 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
16270 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
16280 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
16290 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
162a0 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
162b0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
162c0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
162d0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
162e0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
162f0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
16300 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
16310 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16320 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
16330 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
16340 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
16350 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
16360 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
16370 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
16380 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d  pare, 0);.  rc =
16390 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
163a0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
163b0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
163c0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
163d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
163e0 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
163f0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
16400 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
16410 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
16420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
16430 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
16440 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  v2(.  sqlite3* d
16450 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
16460 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
16470 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
16480 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
16490 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
164a0 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
164b0 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
164c0 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
164d0 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
164e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
164f0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
16500 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
16510 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
16520 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
16530 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
16540 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
16550 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29   xCompare, xDel)
16560 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16570 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
16580 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16590 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
165a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
165b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
165c0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
165d0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
165e0 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
165f0 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
16600 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
16610 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16620 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
16630 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  n16(.  sqlite3* 
16640 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  db, .  const voi
16650 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  d *zName,.  int 
16660 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
16670 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
16680 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
16690 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
166a0 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
166b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
166c0 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  _OK;.  char *zNa
166d0 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  me8;.  sqlite3_m
166e0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
166f0 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
16700 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
16710 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d  ed );.  zName8 =
16720 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
16730 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  (db, zName, -1, 
16740 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
16750 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  VE);.  if( zName
16760 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72  8 ){.    rc = cr
16770 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
16780 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e  , zName8, (u8)en
16790 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
167a0 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
167b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
167c0 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  me8);.  }.  rc =
167d0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
167e0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
167f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
16800 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
16810 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
16820 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16830 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
16840 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
16850 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
16860 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
16870 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
16880 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
16890 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
168a0 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
168b0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
168c0 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
168d0 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
168e0 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73  tion_needed(.  s
168f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
16900 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
16910 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
16920 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a  ollNeeded)(void*
16930 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
16940 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61  extRep,const cha
16950 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  r*).){.  sqlite3
16960 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16970 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
16980 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
16990 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
169a0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
169b0 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
169c0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
169d0 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
169e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
169f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
16a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16a10 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
16a20 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
16a30 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
16a40 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
16a50 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
16a60 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
16a70 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
16a80 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
16a90 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
16aa0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
16ab0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
16ac0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
16ad0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
16ae0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
16af0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
16b00 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
16b10 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
16b20 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
16b30 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
16b40 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
16b50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
16b60 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
16b70 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
16b80 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f  d = 0;.  db->xCo
16b90 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f  llNeeded16 = xCo
16ba0 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62  llNeeded16;.  db
16bb0 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
16bc0 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
16bd0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
16be0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
16bf0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
16c00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
16c10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16c20 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
16c30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
16c40 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
16c50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
16c60 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e   now an anachron
16c70 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20  ism. It used to 
16c80 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76  be used to recov
16c90 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c  er from a.** mal
16ca0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62  loc() failure, b
16cb0 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f  ut SQLite now do
16cc0 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69  es this automati
16cd0 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cally..*/.int sq
16ce0 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
16cf0 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65  over(void){.  re
16d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16d10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16d20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  Test to see whet
16d30 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64  her or not the d
16d40 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16d50 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  on is in autocom
16d60 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65  mit.** mode.  Re
16d70 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
16d80 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  is and FALSE if 
16d90 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  not.  Autocommit
16da0 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62   mode is on.** b
16db0 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f  y default.  Auto
16dc0 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c  commit is disabl
16dd0 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74  ed by a BEGIN st
16de0 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e  atement and reen
16df0 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  abled.** by the 
16e00 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52  next COMMIT or R
16e10 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  OLLBACK..*/.int 
16e20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
16e30 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
16e40 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
16e50 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
16e60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
16e70 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
16e80 65 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f  e substitutes fo
16e90 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
16ea0 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
16eb0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
16ec0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
16ed0 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20  QLITE_IOERR and 
16ee0 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
16ef0 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
16f00 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74  s.  They serve t
16f10 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
16f20 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
16f30 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
16f40 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
16f50 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
16f60 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
16f70 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
16f80 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
16f90 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
16fa0 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
16fb0 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
16fc0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
16fd0 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
16fe0 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
16ff0 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
17000 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
17010 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
17020 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
17030 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
17040 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
17050 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17060 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
17070 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
17080 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20  _CORRUPT,.      
17090 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73          "databas
170a0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20  e corruption at 
170b0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
170c0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
170d0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
170e0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
170f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17100 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e  TE_CORRUPT;.}.in
17110 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
17120 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
17130 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
17140 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
17150 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
17160 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
17170 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20  E_MISUSE, .     
17180 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65           "misuse
17190 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
171a0 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
171b0 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
171c0 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
171d0 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
171e0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d  SQLITE_MISUSE;.}
171f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74  .int sqlite3Cant
17200 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69  openError(int li
17210 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
17220 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
17230 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
17240 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
17250 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
17260 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17270 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
17280 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
17290 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
172a0 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
172b0 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
172c0 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
172d0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
172e0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
172f0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
17300 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
17310 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  is a convenience
17320 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61   routine that ma
17330 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c  kes sure that al
17340 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  l thread-specifi
17350 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68  c.** data for th
17360 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65  is thread has be
17370 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a  en deallocated..
17380 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20  **.** SQLite no 
17390 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65  longer uses thre
173a0 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
173b0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
173c0 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d   is now a.** no-
173d0 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69  op.  It is retai
173e0 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ned for historic
173f0 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  al compatibility
17400 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17410 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
17420 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66  (void){.}.#endif
17430 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d  ../*.** Return m
17440 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
17450 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63  about a specific
17460 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74   column of a dat
17470 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
17480 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73  See comment in s
17490 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65  qlite3.h (sqlite
174a0 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69  .h.in) for detai
174b0 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ls..*/.#ifdef SQ
174c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
174d0 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20  MN_METADATA.int 
174e0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
174f0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
17500 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17520 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  Connection handl
17530 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
17540 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20  r *zDbName,     
17550 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
17560 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ame or NULL */. 
17570 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
17580 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
17590 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
175a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
175b0 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43  umnName,    /* C
175c0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
175d0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44  char const **pzD
175e0 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f  ataType,    /* O
175f0 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20  UTPUT: Declared 
17600 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  data type */.  c
17610 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f  har const **pzCo
17620 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55  llSeq,     /* OU
17630 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20  TPUT: Collation 
17640 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
17650 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c  .  int *pNotNull
17660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17670 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
17680 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  f NOT NULL const
17690 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  raint exists */.
176a0 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b    int *pPrimaryK
176b0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
176c0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
176d0 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20   column part of 
176e0 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75  PK */.  int *pAu
176f0 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20  toinc           
17700 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
17710 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73  rue if column is
17720 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20   auto-increment 
17730 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
17740 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
17750 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
17760 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
17770 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
17780 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20  t iCol;..  char 
17790 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65  const *zDataType
177a0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
177b0 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30  st *zCollSeq = 0
177c0 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20  ;.  int notnull 
177d0 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61  = 0;.  int prima
177e0 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  rykey = 0;.  int
177f0 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20   autoinc = 0;.. 
17800 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
17810 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
17820 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
17830 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
17840 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
17850 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
17860 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
17870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
17880 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29  it(db, &zErrMsg)
17890 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
178a0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  K!=rc ){.    got
178b0 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
178c0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
178d0 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74  e table in quest
178e0 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  ion */.  pTab = 
178f0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
17900 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
17910 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
17920 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e   !pTab || pTab->
17930 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
17940 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  Tab = 0;.    got
17950 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
17960 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
17970 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68  column for which
17980 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74   info is request
17990 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ed */.  if( sqli
179a0 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75  te3IsRowid(zColu
179b0 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69  mnName) ){.    i
179c0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
179d0 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  y;.    if( iCol>
179e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  =0 ){.      pCol
179f0 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
17a00 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Col];.    }.  }e
17a10 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
17a20 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
17a30 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
17a40 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
17a50 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
17a60 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
17a70 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
17a80 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
17a90 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
17aa0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17ab0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
17ac0 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
17ad0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b  .      pTab = 0;
17ae0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  .      goto erro
17af0 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  r_out;.    }.  }
17b00 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
17b10 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
17b20 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
17b30 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
17b40 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
17b50 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
17b60 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
17b70 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
17b80 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
17b90 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
17ba0 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
17bb0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
17bc0 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
17bd0 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
17be0 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
17bf0 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
17c00 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
17c10 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
17c20 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
17c30 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
17c40 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
17c50 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
17c60 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
17c70 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
17c80 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
17c90 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
17ca0 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
17cb0 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
17cc0 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
17cd0 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
17ce0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
17cf0 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
17d00 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
17d10 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c  zDataType = pCol
17d20 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f  ->zType;.    zCo
17d30 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
17d40 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
17d50 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c   = pCol->notNull
17d60 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  !=0;.    primary
17d70 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f  key  = (pCol->co
17d80 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
17d90 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20  _PRIMKEY)!=0;.  
17da0 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
17db0 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
17dc0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
17dd0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
17de0 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ent)!=0;.  }else
17df0 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
17e00 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
17e10 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b   primarykey = 1;
17e20 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c  .  }.  if( !zCol
17e30 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c  lSeq ){.    zCol
17e40 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b  lSeq = "BINARY";
17e50 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  .  }..error_out:
17e60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17e70 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
17e80 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66  /* Whether the f
17e90 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63  unction call suc
17ea0 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64  ceeded or failed
17eb0 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  , set the output
17ec0 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a   parameters.  **
17ed0 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65   to whatever the
17ee0 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72  ir local counter
17ef0 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49  parts contain. I
17f00 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f  f an error did o
17f10 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20  ccur,.  ** this 
17f20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
17f30 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75  f zeroing all ou
17f40 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
17f50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61  .  */.  if( pzDa
17f60 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61  taType ) *pzData
17f70 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65  Type = zDataType
17f80 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65  ;.  if( pzCollSe
17f90 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d  q ) *pzCollSeq =
17fa0 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28   zCollSeq;.  if(
17fb0 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f   pNotNull ) *pNo
17fc0 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b  tNull = notnull;
17fd0 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b  .  if( pPrimaryK
17fe0 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65  ey ) *pPrimaryKe
17ff0 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  y = primarykey;.
18000 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29    if( pAutoinc )
18010 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74   *pAutoinc = aut
18020 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c  oinc;..  if( SQL
18030 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70  ITE_OK==rc && !p
18040 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
18050 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
18060 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d  rMsg);.    zErrM
18070 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
18080 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68  ntf(db, "no such
18090 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25   table column: %
180a0 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d  s.%s", zTableNam
180b0 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  e,.        zColu
180c0 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  mnName);.    rc 
180d0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
180e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
180f0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
18100 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a  , (zErrMsg?"%s":
18110 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0), zErrMsg);.  
18120 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18130 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63  , zErrMsg);.  rc
18140 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
18150 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
18160 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
18170 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
18180 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
18190 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  if../*.** Sleep 
181a0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
181b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
181c0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
181d0 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
181e0 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d  ite3_sleep(int m
181f0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
18200 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  s *pVfs;.  int r
18210 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69  c;.  pVfs = sqli
18220 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
18230 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29  .  if( pVfs==0 )
18240 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
18250 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
18260 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63  orks in millisec
18270 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e  onds, but the un
18280 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70  derlying OsSleep
18290 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65  () .  ** API use
182a0 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  s microseconds. 
182b0 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73  Hence the 1000's
182c0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73  ..  */.  rc = (s
182d0 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56  qlite3OsSleep(pV
182e0 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30  fs, 1000*ms)/100
182f0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
18300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
18310 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
18320 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
18330 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  codes..*/.int sq
18340 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
18350 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69  esult_codes(sqli
18360 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f  te3 *db, int ono
18370 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ff){.  sqlite3_m
18380 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
18390 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
183a0 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
183b0 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
183c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
183d0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
183e0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
183f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18400 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
18410 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
18420 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
18430 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
18440 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
18450 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
18460 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
18470 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
18480 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
18490 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
184a0 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
184b0 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74 65  Btree;..  sqlite
184c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
184d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72  ->mutex);.  pBtr
184e0 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  ee = sqlite3DbNa
184f0 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
18500 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42  bName);.  if( pB
18510 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
18520 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73  r *pPager;.    s
18530 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
18540 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
18550 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
18560 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
18570 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
18580 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
18590 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
185a0 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65  .    fd = sqlite
185b0 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
185c0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
185d0 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  fd!=0 );.    if(
185e0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
185f0 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
18600 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
18610 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
18620 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  fd;.      rc = S
18630 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
18640 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  lse if( fd->pMet
18650 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63  hods ){.      rc
18660 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
18670 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
18680 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pArg);.    }else
18690 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
186a0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
186b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
186c0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
186d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
186e0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
186f0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
18700 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a  n rc;   .}../*.*
18710 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74  * Interface to t
18720 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63  he testing logic
18730 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18740 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
18750 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e  t op, ...){.  in
18760 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65  t rc = 0;.#ifnde
18770 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  f SQLITE_OMIT_BU
18780 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f  ILTIN_TEST.  va_
18790 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
187a0 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
187b0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
187c0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65    /*.    ** Save
187d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
187e0 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a  te of the PRNG..
187f0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
18800 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
18810 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20  PRNG_SAVE: {.   
18820 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61     sqlite3PrngSa
18830 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  veState();.     
18840 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18850 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
18860 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f  tore the state o
18870 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68  f the PRNG to th
18880 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76  e last state sav
18890 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ed using.    ** 
188a0 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50  PRNG_SAVE.  If P
188b0 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76  RNG_SAVE has nev
188c0 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63  er before been c
188d0 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  alled, then.    
188e0 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74  ** this verb act
188f0 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45  s like PRNG_RESE
18900 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  T..    */.    ca
18910 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
18920 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a  RL_PRNG_RESTORE:
18930 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
18940 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65  PrngRestoreState
18950 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
18960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
18970 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20     ** Reset the 
18980 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73  PRNG back to its
18990 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
189a0 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20  tate.  The next 
189b0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
189c0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
189d0 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20  s() will reseed 
189e0 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61  the PRNG using a
189f0 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20   single call.   
18a00 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64   ** to the xRand
18a10 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66  omness method of
18a20 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
18a30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
18a40 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
18a50 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a  L_PRNG_RESET: {.
18a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
18a70 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20  ndomness(0,0);. 
18a80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18a90 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
18aa0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
18ab0 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45  ontrol(BITVEC_TE
18ac0 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61  ST, size, progra
18ad0 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m).    **.    **
18ae0 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69   Run a test agai
18af0 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a  nst a Bitvec obj
18b00 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68  ect of size.  Th
18b10 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65  e program argume
18b20 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20  nt.    ** is an 
18b30 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
18b40 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  s that defines t
18b50 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e  he test.  Return
18b60 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20   -1 on a.    ** 
18b70 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
18b80 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75  n error, 0 on su
18b90 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  ccess, or non-ze
18ba0 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  ro for an error.
18bb0 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20  .    ** See the 
18bc0 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
18bd0 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61  ltinTest() for a
18be0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
18bf0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
18c00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
18c10 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
18c20 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ST: {.      int 
18c30 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
18c40 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
18c50 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28  *aProg = va_arg(
18c60 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
18c70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
18c80 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73  vecBuiltinTest(s
18c90 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20  z, aProg);.     
18ca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18cb0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
18cc0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
18cd0 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  ol(FAULT_INSTALL
18ce0 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20  , xCallback).   
18cf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e   **.    ** Arran
18d00 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61  ge to invoke xCa
18d10 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65  llback() wheneve
18d20 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  r sqlite3FaultSi
18d30 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20  m() is called,. 
18d40 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61     ** if xCallba
18d50 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ck is not NULL..
18d60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73      **.    ** As
18d70 20 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66   a test of the f
18d80 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d  ault simulator m
18d90 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c  echanism itself,
18da0 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
18db0 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61  (0).    ** is ca
18dc0 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
18dd0 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e   after installin
18de0 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61  g the new callba
18df0 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ck and the retur
18e00 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66  n.    ** value f
18e10 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  rom sqlite3Fault
18e20 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74  Sim(0) becomes t
18e30 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20  he return from. 
18e40 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65     ** sqlite3_te
18e50 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20  st_control()..  
18e60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
18e70 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41  LITE_TESTCTRL_FA
18e80 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20  ULT_INSTALL: {. 
18e90 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
18ea0 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
18eb0 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
18ec0 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
18ed0 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
18ee0 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
18ef0 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
18f00 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
18f10 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61  alConfig.xTestCa
18f20 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28  llback = va_arg(
18f30 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29  ap, int(*)(int))
18f40 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
18f50 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45   typedef int(*TE
18f60 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74  STCALLBACKFUNC_t
18f70 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  )(int);.      sq
18f80 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18f90 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20  g.xTestCallback 
18fa0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53  = va_arg(ap, TES
18fb0 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
18fc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18fd0 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b  ite3FaultSim(0);
18fe0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18ff0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
19000 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
19010 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f  _control(BENIGN_
19020 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42  MALLOC_HOOKS, xB
19030 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20  egin, xEnd).    
19040 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74  **.    ** Regist
19050 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c  er hooks to call
19060 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69   to indicate whi
19070 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ch malloc() fail
19080 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65  ures .    ** are
19090 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a   benign..    */.
190a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
190b0 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
190c0 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a  MALLOC_HOOKS: {.
190d0 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
190e0 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69  id (*void_functi
190f0 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20  on)(void);.     
19100 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
19110 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20  BenignBegin;.   
19120 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
19130 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20   xBenignEnd;.   
19140 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20     xBenignBegin 
19150 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
19160 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
19170 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20     xBenignEnd = 
19180 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
19190 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
191a0 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61   sqlite3BenignMa
191b0 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67  llocHooks(xBenig
191c0 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45  nBegin, xBenignE
191d0 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nd);.      break
191e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
191f0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
19200 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
19210 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
19220 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67  DING_BYTE, unsig
19230 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  ned int X).    *
19240 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
19250 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f   PENDING byte to
19260 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
19270 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58  e argument, if X
19280 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20  >0..    ** Make 
19290 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d  no changes if X=
192a0 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  =0.  Return the 
192b0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e  value of the pen
192c0 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a  ding byte.    **
192d0 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20   as it existing 
192e0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
192f0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ine was called..
19300 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d      **.    ** IM
19310 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69  PORTANT:  Changi
19320 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
19330 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30  yte from 0x40000
19340 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20  000 results in. 
19350 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61     ** an incompa
19360 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66  tible database f
19370 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61  ile format.  Cha
19380 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
19390 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68  G byte.    ** wh
193a0 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65  ile any database
193b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
193c0 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75  pen results in u
193d0 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20  ndefined and.   
193e0 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20   ** deleterious 
193f0 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f  behavior..    */
19400 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19410 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
19420 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20  G_BYTE: {.      
19430 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rc = PENDING_BYT
19440 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
19450 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
19460 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
19470 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d  ned int newVal =
19480 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69   va_arg(ap, unsi
19490 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
194a0 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
194b0 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
194c0 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
194d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
194e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
194f0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
19500 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19510 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19520 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
19530 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
19540 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
19550 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
19560 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
19570 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
19580 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
19590 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
195a0 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
195b0 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
195c0 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
195d0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
195e0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
195f0 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
19600 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
19610 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
19620 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
19630 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
19640 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
19650 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
19660 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
19670 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
19680 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
19690 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
196a0 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
196b0 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
196c0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
196d0 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
196e0 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
196f0 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
19700 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19710 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
19720 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
19730 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
19740 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
19750 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
19760 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
19770 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
19780 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
19790 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
197a0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
197b0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
197c0 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
197d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
197e0 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
197f0 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
19800 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
19810 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
19820 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
19830 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
19840 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
19850 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
19860 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
19870 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
19880 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
19890 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
198a0 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
198b0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
198c0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
198d0 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
198e0 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
198f0 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
19900 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
19910 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
19920 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
19930 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
19940 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
19950 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
19960 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
19970 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
19980 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
19990 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
199a0 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
199b0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
199c0 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
199d0 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
199e0 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
199f0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19a00 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
19a10 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
19a20 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
19a30 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
19a40 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
19a50 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
19a60 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
19a70 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
19a80 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
19a90 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
19aa0 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
19ab0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
19ac0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
19ad0 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
19ae0 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
19af0 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
19b00 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
19b10 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
19b20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19b30 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
19b40 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
19b50 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
19b60 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
19b70 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
19b80 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
19b90 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
19ba0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
19bb0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
19bc0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
19bd0 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
19be0 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
19bf0 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
19c00 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
19c10 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
19c20 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
19c30 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
19c40 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
19c50 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
19c60 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
19c70 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
19c80 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
19c90 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19ca0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19cb0 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
19cc0 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
19cd0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
19ce0 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
19cf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19d00 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
19d10 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
19d20 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19d30 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52  STCTRL_BYTEORDER
19d40 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
19d50 20 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74   The integer ret
19d60 75 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68  urned reveals th
19d70 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20  e byte-order of 
19d80 74 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20  the computer on 
19d90 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c  which.    ** SQL
19da0 69 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a  ite is running:.
19db0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
19dc0 20 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e      1     big-en
19dd0 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69  dian,    determi
19de0 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a  ned at run-time.
19df0 20 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20      **      10  
19e00 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
19e10 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
19e20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  run-time.    ** 
19e30 20 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d   432101     big-
19e40 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72  endian,    deter
19e50 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
19e60 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32  -time.    **  12
19e70 33 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d  3410     little-
19e80 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e  endian, determin
19e90 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
19ea0 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63  me.    */ .    c
19eb0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
19ec0 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b  TRL_BYTEORDER: {
19ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19ee0 54 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30  TE_BYTEORDER*100
19ef0 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45   + SQLITE_LITTLE
19f00 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49  ENDIAN*10 + SQLI
19f10 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20  TE_BIGENDIAN;.  
19f20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19f30 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
19f40 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
19f50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19f60 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33  RESERVE, sqlite3
19f70 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
19f80 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
19f90 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65  he nReserve size
19fa0 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61   to N for the ma
19fb0 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74  in database on t
19fc0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
19fd0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
19fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
19ff0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1a000 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20  L_RESERVE: {.   
1a010 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1a020 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1a030 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  te3*);.      int
1a040 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   x = va_arg(ap,i
1a050 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1a060 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1a070 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1a080 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1a090 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  PageSize(db->aDb
1a0a0 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30  [0].pBt, 0, x, 0
1a0b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a0c0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1a0d0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
1a0e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1a0f0 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   /*  sqlite3_tes
1a100 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1a110 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
1a120 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33  ZATIONS, sqlite3
1a130 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
1a140 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
1a150 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72  e or disable var
1a160 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
1a170 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ns for testing p
1a180 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20  urposes.  The . 
1a190 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e     ** argument N
1a1a0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
1a1b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
1a1c0 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20  o be disabled.  
1a1d0 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a  For normal.    *
1a1e0 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68  * operation N sh
1a1f0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1a200 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74  idea is that a t
1a210 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b  est program (lik
1a220 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  e the.    ** SQL
1a230 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53   Logic Test or S
1a240 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20  LT test module) 
1a250 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65  can run the same
1a260 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69   SQL multiple ti
1a270 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  mes.    ** with 
1a280 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
1a290 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74  tions disabled t
1a2a0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
1a2b0 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
1a2c0 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64    ** is obtained
1a2d0 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a   in every case..
1a2e0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1a2f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a300 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b  OPTIMIZATIONS: {
1a310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1a320 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1a330 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1a340 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20   db->dbOptFlags 
1a350 3d 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61  = (u16)(va_arg(a
1a360 70 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66  p, int) & 0xffff
1a370 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a380 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
1a390 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20  LITE_N_KEYWORD. 
1a3a0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
1a3b0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1a3c0 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
1a3d0 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72  WORD, const char
1a3e0 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a   *zWord).    **.
1a3f0 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20      ** If zWord 
1a400 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63  is a keyword rec
1a410 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70  ognized by the p
1a420 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75  arser, then retu
1a430 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75  rn the.    ** nu
1a440 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73  mber of keywords
1a450 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69  .  Or if zWord i
1a460 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c  s not a keyword,
1a470 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a   return 0..    *
1a480 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  * .    ** This t
1a490 65 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f  est feature is o
1a4a0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  nly available in
1a4b0 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f   the amalgamatio
1a4c0 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74  n since.    ** t
1a4d0 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  he SQLITE_N_KEYW
1a4e0 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  ORD macro is not
1a4f0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73   defined in this
1a500 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a   file if SQLite.
1a510 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20      ** is built 
1a520 75 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73  using separate s
1a530 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20  ource files..   
1a540 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1a550 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
1a560 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20  EYWORD: {.      
1a570 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72  const char *zWor
1a580 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  d = va_arg(ap, c
1a590 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
1a5a0 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
1a5b0 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64  e3Strlen30(zWord
1a5c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  );.      rc = (s
1a5d0 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
1a5e0 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29  e((u8*)zWord, n)
1a5f0 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54  !=TK_ID) ? SQLIT
1a600 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b  E_N_KEYWORD : 0;
1a610 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a620 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20    }.#endif ..   
1a630 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
1a640 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1a650 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
1a660 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65  MALLOC, sz, &pNe
1a670 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a  w, pFree);.    *
1a680 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46  *.    ** Pass pF
1a690 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33  ree into sqlite3
1a6a0 53 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a  ScratchFree(). .
1a6b0 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74      ** If sz>0 t
1a6c0 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73  hen allocate a s
1a6d0 63 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e  cratch buffer in
1a6e0 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a  to pNew.  .    *
1a6f0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1a700 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
1a710 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20  CHMALLOC: {.    
1a720 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a    void *pFree, *
1a730 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e  *ppNew;.      in
1a740 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d  t sz;.      sz =
1a750 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1a760 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20  ;.      ppNew = 
1a770 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
1a780 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20  *);.      pFree 
1a790 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1a7a0 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  d*);.      if( s
1a7b0 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c  z ) *ppNew = sql
1a7c0 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
1a7d0 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  c(sz);.      sql
1a7e0 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
1a7f0 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72  pFree);.      br
1a800 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1a810 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1a820 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1a830 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
1a840 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f  IME_FAULT, int o
1a850 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  noff);.    **.  
1a860 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65    ** If paramete
1a870 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a  r onoff is non-z
1a880 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74  ero, configure t
1a890 68 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74  he wrappers so t
1a8a0 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  hat all.    ** s
1a8b0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1a8c0 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61  to localtime() a
1a8d0 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c  nd variants fail
1a8e0 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65  . If onoff is ze
1a8f0 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20  ro,.    ** undo 
1a900 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20  this setting..  
1a910 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1a920 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
1a930 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b  CALTIME_FAULT: {
1a940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1a950 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61  obalConfig.bLoca
1a960 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f  ltimeFault = va_
1a970 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1a980 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a990 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1a9a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1a9b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a9c0 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69  NEVER_CORRUPT, i
1a9d0 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt);.    **.    
1a9e0 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
1a9f0 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
1aa00 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64  cates that the d
1aa10 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1aa20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20  always well-.   
1aa30 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e   ** formed and n
1aa40 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54  ever corrupt.  T
1aa50 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61  his flag is clea
1aa60 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e  r by default, in
1aa70 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20  dicating that.  
1aa80 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1aa90 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61  les might have a
1aaa0 72 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74  rbitrary corrupt
1aab0 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68  ion.  Setting th
1aac0 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20  e flag during.  
1aad0 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75    ** testing cau
1aae0 73 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65  ses certain asse
1aaf0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1ab00 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62  in the code to b
1ab10 65 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20  e activated.    
1ab20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72  ** that demonstr
1ab30 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e  at invariants on
1ab40 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
1ab50 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20  abase files..   
1ab60 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ab70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
1ab80 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20  ER_CORRUPT: {.  
1ab90 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1aba0 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72  lConfig.neverCor
1abb0 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70  rupt = va_arg(ap
1abc0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1abd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
1abe0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1abf0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ac00 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f  E_TESTCTRL_VDBE_
1ac10 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62  COVERAGE, xCallb
1ac20 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a  ack, ptr);.    *
1ac30 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1ac40 20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63   VDBE coverage c
1ac50 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
1ac60 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69   to xCallback wi
1ac70 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20  th context .    
1ac80 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a  ** pointer ptr..
1ac90 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1aca0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1acb0 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b  VDBE_COVERAGE: {
1acc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
1acd0 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20  DBE_COVERAGE.   
1ace0 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
1acf0 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63  (*branch_callbac
1ad00 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c  k)(void*,int,u8,
1ad10 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  u8);.      sqlit
1ad20 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1ad30 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f  VdbeBranch = va_
1ad40 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61  arg(ap,branch_ca
1ad50 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73  llback);.      s
1ad60 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ad70 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72  ig.pVdbeBranchAr
1ad80 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f  g = va_arg(ap,vo
1ad90 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  id*);.#endif.   
1ada0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1adb0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1adc0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1add0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
1ade0 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20  ORTER_MMAP, db, 
1adf0 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61  nMax); */.    ca
1ae00 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ae10 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20  RL_SORTER_MMAP: 
1ae20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
1ae30 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
1ae40 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
1ae50 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
1ae60 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
1ae70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1ae80 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ae90 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1aea0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1aeb0 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
1aec0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1aed0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1aee0 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20  K if SQLite has 
1aef0 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
1af00 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f   and SQLITE_ERRO
1af10 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e  R if.    ** not.
1af20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1af30 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1af40 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20  _ISINIT: {.     
1af50 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1af60 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d  alConfig.isInit=
1af70 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
1af80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
1af90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1afa0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
1afb0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1afc0 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20  IT_BUILTIN_TEST 
1afd0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1afe0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
1aff0 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69   a utility routi
1b000 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46  ne, useful to VF
1b010 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
1b020 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a  s, that checks.*
1b030 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61  * to see if a da
1b040 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20  tabase file was 
1b050 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61  a URI that conta
1b060 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20  ined a specific 
1b070 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65  query .** parame
1b080 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f  ter, and if so o
1b090 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  btains the value
1b0a0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61   of the query pa
1b0b0 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
1b0c0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1b0d0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c  ument is the fil
1b0e0 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61  ename pointer pa
1b0f0 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f  ssed into the xO
1b100 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  pen().** method 
1b110 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65  of a VFS impleme
1b120 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50  ntation.  The zP
1b130 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73  aram argument is
1b140 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1b150 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
1b160 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68  ter we seek.  Th
1b170 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1b180 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1b190 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61  the zParam.** pa
1b1a0 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78  rameter if it ex
1b1b0 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61  ists.  If the pa
1b1c0 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74  rameter does not
1b1d0 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75   exist, this rou
1b1e0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
1b1f0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
1b200 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1b210 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1b220 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  eter(const char 
1b230 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73  *zFilename, cons
1b240 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b  t char *zParam){
1b250 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1b260 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1b270 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1b280 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1b290 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1b2a0 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d   while( zFilenam
1b2b0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
1b2c0 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  x = strcmp(zFile
1b2d0 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1b2e0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
1b2f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1b300 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
1b310 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72      if( x==0 ) r
1b320 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
1b330 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
1b340 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1b350 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1b360 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1b370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b380 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  n a boolean valu
1b390 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
1b3a0 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rameter..*/.int 
1b3b0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
1b3c0 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ean(const char *
1b3d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
1b3e0 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69   char *zParam, i
1b3f0 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e  nt bDflt){.  con
1b400 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1b410 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1b420 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
1b430 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d  aram);.  bDflt =
1b440 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74   bDflt!=0;.  ret
1b450 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47  urn z ? sqlite3G
1b460 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66  etBoolean(z, bDf
1b470 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a  lt) : bDflt;.}..
1b480 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36  /*.** Return a 6
1b490 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
1b4a0 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
1b4b0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71  parameter..*/.sq
1b4c0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1b4d0 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20  te3_uri_int64(. 
1b4e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1b4f0 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69  lename,    /* Fi
1b500 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64  lename as passed
1b510 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63   to xOpen */.  c
1b520 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1b530 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20  m,       /* URI 
1b540 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74  parameter sought
1b550 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1b560 74 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20  t64 bDflt       
1b570 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72  /* return if par
1b580 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e  ameter is missin
1b590 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  g */.){.  const 
1b5a0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1b5b0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1b5c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1b5d0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  m);.  sqlite3_in
1b5e0 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26  t64 v;.  if( z &
1b5f0 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
1b600 78 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53  xToI64(z, &v)==S
1b610 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b620 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
1b630 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
1b640 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b650 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
1b660 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
1b670 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
1b680 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1b690 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
1b6a0 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1b6b0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1b6c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1b6d0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1b6e0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1b6f0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
1b700 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
1b710 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d  .     && (zDbNam
1b720 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
1b730 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  trICmp(zDbName, 
1b740 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
1b750 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
1b760 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44     return db->aD
1b770 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a  b[i].pBt;.    }.
1b780 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1b790 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b7a0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20  the filename of 
1b7b0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1b7c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
1b7d0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1b7e0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
1b7f0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62  char *sqlite3_db
1b800 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65  _filename(sqlite
1b810 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1b820 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1b830 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69  tree *pBt = sqli
1b840 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1b850 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1b860 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1b870 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
1b880 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a  ename(pBt) : 0;.
1b890 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b8a0 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  1 if database is
1b8b0 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20   read-only or 0 
1b8c0 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  if read/write.  
1b8d0 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
1b8e0 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
1b8f0 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
1b900 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1b910 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nly(sqlite3 *db,
1b920 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1b930 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1b940 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1b950 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1b960 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1b970 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
1b980 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70  treeIsReadonly(p
1b990 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a              Bt) : -1;.}.