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

Artifact 2ba4f6eeb84cf8efd8bb632c1abe203dc86adcac:


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 63 61  k;.    }..    ca
4070: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4080: 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71  _URI: {.      sq
4090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
40a0: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
40b0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
40c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
40d0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
40f0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
4100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4110: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
4120: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
4130: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4140: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
4150: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
4160: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
4170: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
4180: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
4190: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
41a0: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
41b0: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
41c0: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
41d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
41e0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
41f0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
4200: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4210: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4220: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
4230: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4240: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
4250: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4260: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4270: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
4280: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4290: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
42a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
42b0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
42c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
42d0: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
42e0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
42f0: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  4);.      if( mx
4300: 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70  Mmap<0 || mxMmap
4310: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50  >SQLITE_MAX_MMAP
4320: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
4330: 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   mxMmap = SQLITE
4340: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a  _MAX_MMAP_SIZE;.
4350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4360: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4370: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
4380: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  p;.      if( szM
4390: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
43a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
43b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
43c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
43d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
43e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
43f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
4400: 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
4410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4420: 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
4430: 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64  S_WIN && defined
4440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
4450: 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65 20 53  LLOC).    case S
4460: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
4470: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
4480: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4490: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
44a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
44b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
44c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
44d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
44e0: 46 49 47 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  FIG_WORKER_THREA
44f0: 44 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  DS: {.      int 
4500: 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  n = va_arg(ap, i
4510: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  nt);.      if( n
4520: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b  >SQLITE_MAX_WORK
4530: 45 52 5f 54 48 52 45 41 44 53 20 29 20 6e 20 3d  ER_THREADS ) n =
4540: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
4550: 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 20 20  ER_THREADS;.    
4560: 20 20 69 66 28 20 6e 3e 3d 30 20 29 20 73 71 6c    if( n>=0 ) sql
4570: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4580: 2e 6e 57 6f 72 6b 65 72 20 3d 20 6e 3b 0a 20 20  .nWorker = n;.  
4590: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
45a0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
45b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
45c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
45d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
45e0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
45f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4600: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20  *.** Set up the 
4610: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
4620: 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  s for a database
4630: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20   connection..** 
4640: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4650: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a   on success.  .*
4660: 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69  * If lookaside i
4670: 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
4680: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
4690: 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BUSY..**.** The 
46a0: 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  sz parameter is 
46b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
46c0: 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b  tes in each look
46d0: 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54  aside slot..** T
46e0: 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72  he cnt parameter
46f0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
4700: 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74  f slots.  If pSt
4710: 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a  art is NULL the.
4720: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
4730: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4740: 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
4750: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4760: 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72  c()..** If pStar
4770: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
4780: 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20  en it is sz*cnt 
4790: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
47a0: 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68  to use for.** th
47b0: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
47c0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
47d0: 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  t setupLookaside
47e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
47f0: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a  id *pBuf, int sz
4800: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f  , int cnt){.  vo
4810: 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66  id *pStart;.  if
4820: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
4830: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  nOut ){.    retu
4840: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
4850: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
4860: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
4870: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
4880: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
4890: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
48a0: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
48b0: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
48c0: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
48d0: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
48e0: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
48f0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
4900: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
4910: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
4920: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
4930: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
4940: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
4950: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
4960: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
4970: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
4980: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
4990: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
49a0: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
49b0: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
49c0: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
49d0: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
49e0: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
49f0: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
4a00: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
4a10: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
4a20: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
4a30: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
4a40: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
4a50: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
4a60: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
4a70: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
4a80: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
4a90: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
4aa0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
4ab0: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
4ac0: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
4ad0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
4ae0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
4af0: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
4b00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
4b10: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
4b20: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
4b30: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
4b40: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
4b50: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
4b60: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
4b70: 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20  ide.pFree = 0;. 
4b80: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73   db->lookaside.s
4b90: 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69  z = (u16)sz;.  i
4ba0: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
4bb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b   int i;.    Look
4bc0: 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20  asideSlot *p;.  
4bd0: 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28    assert( sz > (
4be0: 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61  int)sizeof(Looka
4bf0: 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20  sideSlot*) );.  
4c00: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
4c10: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
4c20: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
4c30: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
4c40: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
4c50: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b  lookaside.pFree;
4c60: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
4c70: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a  side.pFree = p;.
4c80: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
4c90: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
4ca0: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
4cb0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4cc0: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
4cd0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
4ce0: 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64  abled = 1;.    d
4cf0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
4d00: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
4d10: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
4d20: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4d30: 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20  e.pStart = db;. 
4d40: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4d50: 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20  .pEnd = db;.    
4d60: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
4d70: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  nabled = 0;.    
4d80: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
4d90: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d  alloced = 0;.  }
4da0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4db0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
4dc0: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
4dd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
4de0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4df0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
4e00: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
4e10: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
4e20: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
4e30: 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a  db->mutex;.}../*
4e40: 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d  .** Free up as m
4e50: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65  uch memory as we
4e60: 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69   can from the gi
4e70: 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ven database.** 
4e80: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  connection..*/.i
4e90: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
4ea0: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c  lease_memory(sql
4eb0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
4ec0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   i;.  sqlite3_mu
4ed0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
4ee0: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
4ef0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
4f00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
4f10: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
4f20: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
4f30: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
4f40: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
4f50: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
4f60: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
4f70: 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Pager(pBt);.    
4f80: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68    sqlite3PagerSh
4f90: 72 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  rink(pPager);.  
4fa0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
4fb0: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
4fc0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  b);.  sqlite3_mu
4fd0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
4fe0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
4ff0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5000: 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
5010: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e   settings for an
5020: 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61   individual data
5030: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
5040: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
5050: 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33  b_config(sqlite3
5060: 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e   *db, int op, ..
5070: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
5080: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61  ;.  int rc;.  va
5090: 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
50a0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
50b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
50c0: 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49  DBCONFIG_LOOKASI
50d0: 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64  DE: {.      void
50e0: 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28   *pBuf = va_arg(
50f0: 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49  ap, void*); /* I
5100: 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36  MP: R-26835-1096
5110: 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  4 */.      int s
5120: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
5130: 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d  nt);       /* IM
5140: 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34  P: R-47871-25994
5150: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   */.      int cn
5160: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
5170: 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50  nt);      /* IMP
5180: 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20  : R-04460-53386 
5190: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  */.      rc = se
51a0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
51b0: 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b   pBuf, sz, cnt);
51c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
51d0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
51e0: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
51f0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
5200: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20         int op;  
5210: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
5220: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  e */.        u32
5230: 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73   mask;    /* Mas
5240: 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20  k of the bit in 
5250: 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f  sqlite3.flags to
5260: 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20   set/clear */.  
5270: 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20      } aFlagOp[] 
5280: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51  = {.        { SQ
5290: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
52a0: 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53 51  ABLE_FKEY,    SQ
52b0: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
52c0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
52d0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
52e0: 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c  _ENABLE_TRIGGER,
52f0: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72   SQLITE_EnableTr
5300: 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20  igger  },.      
5310: 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  };.      unsigne
5320: 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72  d int i;.      r
5330: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
5340: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39  ; /* IMP: R-4279
5350: 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20  0-23372 */.     
5360: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
5370: 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20  ySize(aFlagOp); 
5380: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
5390: 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d  ( aFlagOp[i].op=
53a0: 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =op ){.         
53b0: 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f   int onoff = va_
53c0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
53d0: 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65          int *pRe
53e0: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
53f0: 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nt*);.          
5400: 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64  int oldFlags = d
5410: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  b->flags;.      
5420: 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20      if( onoff>0 
5430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ){.            d
5440: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61  b->flags |= aFla
5450: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  gOp[i].mask;.   
5460: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
5470: 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20   onoff==0 ){.   
5480: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
5490: 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69  gs &= ~aFlagOp[i
54a0: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
54b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
54c0: 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e  ( oldFlags!=db->
54d0: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  flags ){.       
54e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
54f0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
5500: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ents(db);.      
5510: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5520: 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20  if( pRes ){.    
5530: 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
5540: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c  (db->flags & aFl
5550: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30  agOp[i].mask)!=0
5560: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5570: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
5580: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
5590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
55a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
55b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
55c0: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
55d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
55e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
55f0: 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72  ue if the buffer
5600: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61   z[0..n-1] conta
5610: 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a  ins all spaces..
5620: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
5630: 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68  lSpaces(const ch
5640: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
5650: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
5660: 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d  [n-1]==' ' ){ n-
5670: 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d  -; }.  return n=
5680: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  =0;.}../*.** Thi
5690: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
56a0: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
56b0: 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52  ion named "BINAR
56c0: 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  Y" which is alwa
56d0: 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  ys.** available.
56e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
56f0: 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  dFlag argument i
5700: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
5710: 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74  space padding at
5720: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73   the end.** of s
5730: 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65  trings is ignore
5740: 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65  d.  This impleme
5750: 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f  nts the RTRIM co
5760: 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  llation..*/.stat
5770: 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75  ic int binCollFu
5780: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46  nc(.  void *padF
5790: 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  lag,.  int nKey1
57a0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
57b0: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
57c0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
57d0: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
57e0: 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
57f0: 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
5800: 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65  nKey2;.  rc = me
5810: 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79  mcmp(pKey1, pKey
5820: 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  2, n);.  if( rc=
5830: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61  =0 ){.    if( pa
5840: 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c  dFlag.     && al
5850: 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29  lSpaces(((char*)
5860: 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d  pKey1)+n, nKey1-
5870: 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  n).     && allSp
5880: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
5890: 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a  y2)+n, nKey2-n).
58a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
58b0: 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e 67  Leave rc unchang
58c0: 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d  ed at 0 */.    }
58d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
58e0: 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
58f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5900: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5910: 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e  Another built-in
5920: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
5930: 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a  nce: NOCASE. .**
5940: 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69  .** This collati
5950: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 69  ng sequence is i
5960: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
5970: 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64  ed for "case ind
5980: 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70  ependent.** comp
5990: 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27  arison". SQLite'
59a0: 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75  s knowledge of u
59b0: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63  pper and lower c
59c0: 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a  ase equivalents.
59d0: 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20  ** extends only 
59e0: 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61 63  to the 26 charac
59f0: 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68 65  ters used in the
5a00: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
5a10: 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20  e..**.** At the 
5a20: 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20  moment there is 
5a30: 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70  only a UTF-8 imp
5a40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
5a50: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73  static int nocas
5a60: 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a  eCollatingFunc(.
5a70: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
5a80: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
5a90: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
5aa0: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
5ab0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
5ac0: 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c  ){.  int r = sql
5ad0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20  ite3StrNICmp(.  
5ae0: 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20      (const char 
5af0: 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20  *)pKey1, (const 
5b00: 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e  char *)pKey2, (n
5b10: 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79  Key1<nKey2)?nKey
5b20: 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53  1:nKey2);.  UNUS
5b30: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
5b40: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d  Used);.  if( 0==
5b50: 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65  r ){.    r = nKe
5b60: 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20  y1-nKey2;.  }.  
5b70: 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a  return r;.}../*.
5b80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f  ** Return the RO
5b90: 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  WID of the most 
5ba0: 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f  recent insert.*/
5bb0: 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71  .sqlite_int64 sq
5bc0: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
5bd0: 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20  t_rowid(sqlite3 
5be0: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
5bf0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a  b->lastRowid;.}.
5c00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5c10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
5c20: 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20  ges in the most 
5c30: 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73  recent call to s
5c40: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a  qlite3_exec()..*
5c50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68  /.int sqlite3_ch
5c60: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
5c70: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
5c80: 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  >nChange;.}../*.
5c90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5ca0: 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
5cb0: 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61  since the databa
5cc0: 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70  se handle was op
5cd0: 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ened..*/.int sql
5ce0: 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
5cf0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
5d00: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54  .  return db->nT
5d10: 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  otalChange;.}../
5d20: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f  *.** Close all o
5d30: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
5d40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  This function on
5d50: 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66  ly manipulates f
5d60: 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20  ields of the.** 
5d70: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
5d80: 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20  object, it does 
5d90: 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61  not close any sa
5da0: 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61  vepoints that ma
5db0: 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20  y be open.** at 
5dc0: 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72  the b-tree/pager
5dd0: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20   level..*/.void 
5de0: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
5df0: 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  points(sqlite3 *
5e00: 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62  db){.  while( db
5e10: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->pSavepoint ){.
5e20: 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70      Savepoint *p
5e30: 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  Tmp = db->pSavep
5e40: 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53  oint;.    db->pS
5e50: 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d  avepoint = pTmp-
5e60: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
5e70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
5e80: 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e  mp);.  }.  db->n
5e90: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
5ea0: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
5eb0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61  = 0;.  db->isTra
5ec0: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
5ed0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
5ee0: 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  Invoke the destr
5ef0: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61  uctor function a
5f00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46  ssociated with F
5f10: 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79  uncDef p, if any
5f20: 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20  . Except,.** if 
5f30: 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
5f40: 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65  last copy of the
5f50: 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f   function, do no
5f60: 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c  t invoke it. Mul
5f70: 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20  tiple.** copies 
5f80: 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63  of a single func
5f90: 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64  tion are created
5fa0: 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e   when create_fun
5fb0: 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65  ction() is calle
5fc0: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
5fd0: 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f  _ANY as the enco
5fe0: 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ding..*/.static 
5ff0: 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73  void functionDes
6000: 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62  troy(sqlite3 *db
6010: 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20  , FuncDef *p){. 
6020: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
6030: 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  *pDestructor = p
6040: 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20  ->pDestructor;. 
6050: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
6060: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63   ){.    pDestruc
6070: 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tor->nRef--;.   
6080: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
6090: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
60a0: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
60b0: 78 44 65 73 74 72 6f 79 28 70 44 65 73 74 72 75  xDestroy(pDestru
60c0: 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29  ctor->pUserData)
60d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
60e0: 62 46 72 65 65 28 64 62 2c 20 70 44 65 73 74 72  bFree(db, pDestr
60f0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  uctor);.    }.  
6100: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f  }.}../*.** Disco
6110: 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65  nnect all sqlite
6120: 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74  3_vtab objects t
6130: 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61  hat belong to da
6140: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
6150: 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73  n.** db. This is
6160: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20   called when db 
6170: 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e  is being closed.
6180: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6190: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
61a0: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  b(sqlite3 *db){.
61b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
61c0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
61d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
61e0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
61f0: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
6200: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6210: 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  {.    Schema *pS
6220: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
6230: 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  i].pSchema;.    
6240: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
6250: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
6260: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
6270: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
6280: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
6290: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20  a->tblHash); p; 
62a0: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
62b0: 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (p)){.        Ta
62c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62  ble *pTab = (Tab
62d0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
62e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ata(p);.        
62f0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
6300: 61 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61  ab) ) sqlite3Vta
6310: 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  bDisconnect(db, 
6320: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTab);.      }. 
6330: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
6340: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
6350: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
6360: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
6370: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
6380: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
6390: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
63a0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
63b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
63c0: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
63d0: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
63e0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
63f0: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
6400: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
6410: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
6420: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
6430: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
6440: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
6450: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6460: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
6470: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
6480: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
6490: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
64a0: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
64b0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
64c0: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
64d0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
64e0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
64f0: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
6500: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6510: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
6520: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
6530: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
6540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6550: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
6560: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
6570: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
6580: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
6590: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
65a0: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
65b0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
65c0: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
65d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
65e0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
65f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6600: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6610: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
6620: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
6630: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
6640: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
6650: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
6660: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
6670: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
6680: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
6690: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
66a0: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
66b0: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
66c0: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
66d0: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
66e0: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
66f0: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
6700: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
6710: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
6720: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
6730: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
6740: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
6750: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
6760: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
6770: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
6780: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
6790: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
67a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
67b0: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
67c0: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
67d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
67e0: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
67f0: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6800: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
6810: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
6820: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
6830: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
6840: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
6850: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
6860: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
6870: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
6880: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
6890: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
68a0: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
68b0: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
68c0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
68d0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
68e0: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
68f0: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
6900: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
6910: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6920: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
6930: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6940: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6950: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
6960: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
6970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6980: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
6990: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
69a0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
69b0: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20  .    /* Closing 
69c0: 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72  the handle. Four
69d0: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
69e0: 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
69f0: 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74   2. */.    sqlit
6a00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
6a10: 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c  Sqllog(sqlite3Gl
6a20: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
6a30: 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29  ogArg, db, 0, 2)
6a40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6a50: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63  /* Convert the c
6a60: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  onnection into a
6a70: 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e   zombie and then
6a80: 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a   close it..  */.
6a90: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
6aa0: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
6ab0: 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76  E;.  sqlite3Leav
6ac0: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6ad0: 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75  mbie(db);.  retu
6ae0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6af0: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61  ./*.** Two varia
6b00: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62  tions on the pub
6b10: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f  lic interface fo
6b20: 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61  r closing a data
6b30: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
6b40: 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  on. The sqlite3_
6b50: 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20  close() version 
6b60: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
6b70: 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65  USY and.** leave
6b80: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
6b90: 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65   option if there
6ba0: 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64   are unfinalized
6bb0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6bc0: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6bd0: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6be0: 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69  ckups.  The sqli
6bf0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a  te3_close_v2().*
6c00: 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73  * version forces
6c10: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6c20: 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62  to become a zomb
6c30: 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  ie if there are.
6c40: 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f  ** unclosed reso
6c50: 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e  urces, and arran
6c60: 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ges for dealloca
6c70: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61  tion when the la
6c80: 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74  st.** prepare st
6c90: 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74  atement or sqlit
6ca0: 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73  e3_backup closes
6cb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6cc0: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
6cd0: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6ce0: 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20  te3Close(db,0); 
6cf0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  }.int sqlite3_cl
6d00: 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a  ose_v2(sqlite3 *
6d10: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6d20: 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20  te3Close(db,1); 
6d30: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
6d40: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  the mutex on dat
6d50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6d60: 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68   db..**.** Furth
6d70: 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62  ermore, if datab
6d80: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6d90: 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d  b is a zombie (m
6da0: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72  eaning that ther
6db0: 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20  e.** has been a 
6dc0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
6dd0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
6de0: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
6df0: 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20  _v2(db)) and.** 
6e00: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74  every sqlite3_st
6e10: 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  mt has now been 
6e20: 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76  finalized and ev
6e30: 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ery sqlite3_back
6e40: 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  up has.** finish
6e50: 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c  ed, then free al
6e60: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  l resources..*/.
6e70: 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76  void sqlite3Leav
6e80: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6e90: 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  mbie(sqlite3 *db
6ea0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
6eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ec0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
6ed0: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
6ee0: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66   int j;..  /* If
6ef0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
6f00: 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73  anding sqlite3_s
6f10: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  tmt or sqlite3_b
6f20: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20  ackup objects.  
6f30: 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e  ** or if the con
6f40: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  nection has not 
6f50: 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20  yet been closed 
6f60: 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  by sqlite3_close
6f70: 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  _v2(),.  ** then
6f80: 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20   just leave the 
6f90: 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e  mutex and return
6fa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
6fb0: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
6fc0: 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63  AGIC_ZOMBIE || c
6fd0: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
6fe0: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
6ff0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7000: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
7010: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
7020: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
7030: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
7040: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
7050: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
7060: 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61  as.  ** closed a
7070: 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ll sqlite3_stmt 
7080: 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  and sqlite3_back
7090: 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68  up objects and h
70a0: 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73  as been.  ** pas
70b0: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  sed to sqlite3_c
70c0: 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  lose (meaning th
70d0: 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69  at it is a zombi
70e0: 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a  e).  Therefore,.
70f0: 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
7100: 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  d free all resou
7110: 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  rces..  */..  /*
7120: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
7130: 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20  n is open, roll 
7140: 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c  it back. This al
7150: 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  so ensures that 
7160: 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61  if.  ** any data
7170: 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76  base schemas hav
7180: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
7190: 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65  by an uncommitte
71a0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d transaction.  
71b0: 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65  ** they are rese
71c0: 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  t. And that the 
71d0: 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20  required b-tree 
71e0: 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f  mutex is held to
71f0: 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70   make.  ** the p
7200: 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ager rollback an
7210: 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61  d schema reset a
7220: 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69  n atomic operati
7230: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
7240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
7250: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f  SQLITE_OK);..  /
7260: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
7270: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
7280: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
7290: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
72a0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
72b0: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
72c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
72d0: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
72e0: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
72f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
7300: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
7310: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
7320: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
7330: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
7340: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
7350: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
7360: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
7370: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
7380: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
7390: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
73a0: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
73b0: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
73c0: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
73d0: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
73e0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
73f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
7400: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
7410: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
7420: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
7430: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
7440: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
7450: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
7460: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
7470: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
7480: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
7490: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
74a0: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
74b0: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
74c0: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
74d0: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
74e0: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
74f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
7500: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
7510: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
7520: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
7530: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
7540: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
7550: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
7560: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
7570: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
7580: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
7590: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
75a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
75b0: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
75c0: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
75d0: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
75e0: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
75f0: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
7600: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
7610: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
7620: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
7630: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
7640: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
7650: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7660: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
7670: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
7680: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
7690: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
76a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
76b0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
76c0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
76d0: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
76e0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
76f0: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
7700: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
7710: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
7720: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
7730: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
7740: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
7750: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
7760: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
7770: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
7780: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
7790: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
77a0: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
77b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
77c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
77d0: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
77e0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
77f0: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
7800: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
7810: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7820: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
7830: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7840: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
7850: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
7860: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
7870: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
7880: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
7890: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
78a0: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
78b0: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
78c0: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
78d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
78e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
78f0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
7900: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
7910: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
7920: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
7930: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
7940: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
7950: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
7960: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
7970: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7980: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
7990: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
79a0: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64  nsions(db);..  d
79b0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
79c0: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a  E_MAGIC_ERROR;..
79d0: 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61    /* The temp-da
79e0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
79f0: 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65   allocated diffe
7a00: 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rently from the 
7a10: 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a  other schema.  *
7a20: 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67  * objects (using
7a30: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
7a40: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
7a50: 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  d of sqlite3Btre
7a60: 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a  eSchema())..  **
7a70: 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   So it needs to 
7a80: 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54  be freed here. T
7a90: 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c  odo: Why not rol
7aa0: 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d  l the temp schem
7ab0: 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  a into.  ** the 
7ac0: 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  same sqliteMallo
7ad0: 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74  c() as the one t
7ae0: 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68  hat allocates th
7af0: 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a  e database .  **
7b00: 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f   structure?.  */
7b10: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7b20: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  (db, db->aDb[1].
7b30: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
7b40: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7b50: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
7b60: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7b70: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
7b80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
7b90: 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ree(db->mutex);.
7ba0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
7bb0: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20  okaside.nOut==0 
7bc0: 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20  );  /* Fails on 
7bd0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  a lookaside memo
7be0: 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28  ry leak */.  if(
7bf0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
7c00: 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20  Malloced ){.    
7c10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
7c20: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
7c30: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
7c40: 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  3_free(db);.}../
7c50: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
7c60: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
7c70: 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  .  If tripCode i
7c80: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
7c90: 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65   then.** any ope
7ca0: 6e 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  n cursors are in
7cb0: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
7cc0: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
7cd0: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
7ce0: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
7cf0: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
7d00: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
7d10: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
7d20: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
7d30: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
7d40: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7d50: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71  e3RollbackAll(sq
7d60: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74  lite3 *db, int t
7d70: 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ripCode){.  int 
7d80: 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  i;.  int inTrans
7d90: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7da0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7db0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
7dc0: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
7dd0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
7de0: 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20    /* Obtain all 
7df0: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62  b-tree mutexes b
7e00: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79  efore making any
7e10: 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52   calls to BtreeR
7e20: 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a  ollback(). .  **
7e30: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
7e40: 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  nt in case the t
7e50: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
7e60: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73   rolled back has
7e70: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
7e80: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
7e90: 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  ma. If the b-tre
7ea0: 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f  e mutexes are no
7eb0: 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72  t taken.  ** her
7ec0: 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20  e, then another 
7ed0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e  shared-cache con
7ee0: 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e  nection might sn
7ef0: 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20  eak in between. 
7f00: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
7f10: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
7f20: 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63  hema reset, whic
7f30: 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73  h can cause fals
7f40: 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f  e.  ** corruptio
7f50: 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d  n reports in som
7f60: 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73  e cases.  */.  s
7f70: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7f80: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  All(db);..  for(
7f90: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7fa0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
7fb0: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
7fc0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
7fd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7fe0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7ff0: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
8000: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
8010: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8020: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
8030: 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20  p, tripCode);.  
8040: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8050: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
8060: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
8070: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
8080: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
8090: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
80a0: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
80b0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
80c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
80d0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
80e0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
80f0: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
8100: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
8110: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
8120: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
8130: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
8140: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
8150: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
8160: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
8170: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
8180: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
8190: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
81a0: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
81b0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
81c0: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
81d0: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
81e0: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
81f0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
8200: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
8210: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
8220: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
8230: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
8240: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
8250: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
8260: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
8270: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
8280: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8290: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
82a0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
82b0: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
82c0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
82d0: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
82e0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
82f0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
8300: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
8310: 45 53 54 29 0a 63 6f 6e 73 74 20 63 68 61 72 20  EST).const char 
8320: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
8330: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
8340: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
8350: 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52  ;.  int i, origR
8360: 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  c = rc;.  for(i=
8370: 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d  0; i<2 && zName=
8380: 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30  =0; i++, rc &= 0
8390: 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68  xff){.    switch
83a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
83b0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
83d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
83e0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
83f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8400: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
8410: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
8420: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
8430: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
8440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8450: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
8460: 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20  RNAL:           
8470: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8480: 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20  INTERNAL";      
8490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
84a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
84b0: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
84c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
84d0: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20  _PERM";         
84e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
84f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
8500: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
8510: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8520: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
8530: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
8550: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  BORT_ROLLBACK:  
8560: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8570: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
8580: 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  K";    break;.  
8590: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
85a0: 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20  BUSY:           
85b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
85c0: 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20  ITE_BUSY";      
85d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
85e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
85f0: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20  _BUSY_RECOVERY: 
8600: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8610: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
8620: 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  RY";     break;.
8630: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8640: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a  E_BUSY_SNAPSHOT:
8650: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8660: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
8670: 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  HOT";     break;
8680: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8690: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20  TE_LOCKED:      
86a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
86b0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
86c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
86d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
86e0: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
86f0: 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20  DCACHE: zName = 
8700: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  "SQLITE_LOCKED_S
8710: 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61  HAREDCACHE";brea
8720: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8730: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
8740: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8750: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8770: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8780: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
8790: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
87a0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
87b0: 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  LY";          br
87c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
87d0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
87e0: 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65  RECOVERY:  zName
87f0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
8800: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62  NLY_RECOVERY"; b
8810: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8820: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
8830: 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d  _CANTLOCK:  zNam
8840: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
8850: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20  ONLY_CANTLOCK"; 
8860: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8870: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
8880: 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61  Y_ROLLBACK:  zNa
8890: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
88a0: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b  DONLY_ROLLBACK";
88b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
88c0: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
88d0: 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e  LY_DBMOVED:   zN
88e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
88f0: 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b  ADONLY_DBMOVED";
8900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8910: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
8920: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a  RUPT:          z
8930: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8940: 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20  NTERRUPT";      
8950: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8960: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8970: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
8980: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8990: 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20  IOERR";         
89a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
89b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
89c0: 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20  RR_READ:        
89d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
89e0: 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20  _IOERR_READ";   
89f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8a10: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
8a20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8a30: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
8a40: 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AD";  break;.   
8a50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8a60: 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20  OERR_WRITE:     
8a70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8a80: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
8a90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8aa0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8ab0: 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20  IOERR_FSYNC:    
8ac0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8ad0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22  ITE_IOERR_FSYNC"
8ae0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8af0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8b00: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
8b10: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
8b20: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
8b30: 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SYNC";   break;.
8b40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8b50: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
8b60: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
8b70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
8b80: 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b  CATE";    break;
8b90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8ba0: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20  TE_IOERR_FSTAT: 
8bb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8bc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
8bd0: 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  AT";       break
8be0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8bf0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
8c00: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
8c10: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  "SQLITE_IOERR_UN
8c20: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
8c30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8c40: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
8c50: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
8c60: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
8c70: 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  DLOCK";      bre
8c80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8c90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
8ca0: 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  TE:       zName 
8cb0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8cc0: 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72  DELETE";      br
8cd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8ce0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
8cf0: 43 4b 45 44 3a 20 20 20 20 20 20 7a 4e 61 6d 65  CKED:      zName
8d00: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8d10: 5f 42 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 62  _BLOCKED";     b
8d20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8d30: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
8d40: 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  MEM:        zNam
8d50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8d60: 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  R_NOMEM";       
8d70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8d80: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
8d90: 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61  CCESS:       zNa
8da0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8db0: 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20  RR_ACCESS";     
8dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8dd0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8de0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
8df0: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8e20: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
8e30: 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65  SERVEDLOCK"; bre
8e40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8e50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
8e60: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
8e70: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8e80: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72  LOCK";        br
8e90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8ea0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
8eb0: 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  SE:        zName
8ec0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8ed0: 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62  _CLOSE";       b
8ee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8ef0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
8f00: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d  R_CLOSE:    zNam
8f10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8f20: 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20  R_DIR_CLOSE";   
8f30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8f40: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8f50: 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61  HMOPEN:      zNa
8f60: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8f70: 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20  RR_SHMOPEN";    
8f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8f90: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8fa0: 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e  SHMSIZE:      zN
8fb0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8fc0: 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20  ERR_SHMSIZE";   
8fd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8fe0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8ff0: 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a  _SHMLOCK:      z
9000: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
9010: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20  OERR_SHMLOCK";  
9020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9030: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
9040: 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20  R_SHMMAP:       
9050: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9060: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20  IOERR_SHMMAP";  
9070: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9080: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
9090: 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20  RR_SEEK:        
90a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
90b0: 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20  _IOERR_SEEK";   
90c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
90d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
90e0: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
90f0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
9100: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
9110: 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20  OENT";break;.   
9120: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
9130: 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20  OERR_MMAP:      
9140: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9150: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20  TE_IOERR_MMAP"; 
9160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9170: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9180: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
9190: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
91a0: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
91b0: 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  PPATH"; break;. 
91c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
91d0: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a  _IOERR_CONVPATH:
91e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
91f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
9200: 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATH";    break;.
9210: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9220: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20  E_CORRUPT:      
9230: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9240: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
9250: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9260: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9270: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a  TE_CORRUPT_VTAB:
9280: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9290: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
92a0: 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  TAB";      break
92b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
92c0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20  ITE_NOTFOUND:   
92d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
92e0: 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  "SQLITE_NOTFOUND
92f0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
9300: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9310: 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
9320: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9330: 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20   "SQLITE_FULL"; 
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9350: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9360: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
9370: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9380: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
9390: 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  EN";          br
93a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
93b0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
93c0: 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65  NOTEMPDIR: zName
93d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
93e0: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62  PEN_NOTEMPDIR";b
93f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9400: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9410: 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d  _ISDIR:     zNam
9420: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
9430: 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20  OPEN_ISDIR";    
9440: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9450: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
9460: 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61  N_FULLPATH:  zNa
9470: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
9480: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b  TOPEN_FULLPATH";
9490: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
94a0: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
94b0: 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e  EN_CONVPATH:  zN
94c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
94d0: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22  NTOPEN_CONVPATH"
94e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
94f0: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ase SQLITE_PROTO
9500: 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  COL:           z
9510: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
9520: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20  ROTOCOL";       
9530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9540: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
9550: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
9560: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9570: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20  EMPTY";         
9580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9590: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48   case SQLITE_SCH
95a0: 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20  EMA:            
95b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
95c0: 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20  _SCHEMA";       
95d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
95e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
95f0: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
9600: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9610: 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20  E_TOOBIG";      
9620: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9630: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9640: 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20  ONSTRAINT:      
9650: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9660: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
9670: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9680: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9690: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
96a0: 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  E:  zName = "SQL
96b0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
96c0: 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20  NIQUE"; break;. 
96d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
96e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
96f0: 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  GER: zName = "SQ
9700: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9710: 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a  TRIGGER";break;.
9720: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9730: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
9740: 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20  EIGNKEY:.       
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9770: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9780: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b  INT_FOREIGNKEY";
9790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
97a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
97b0: 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20  TRAINT_CHECK:   
97c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
97d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
97e0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
97f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9800: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
9810: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9840: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
9850: 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72  RIMARYKEY";   br
9860: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9870: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9880: 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65  T_NOTNULL: zName
9890: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
98a0: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62  RAINT_NOTNULL";b
98b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
98c0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
98d0: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20  NT_COMMITHOOK:. 
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9900: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9910: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
9920: 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a  HOOK";   break;.
9930: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9940: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
9950: 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  B:    zName = "S
9960: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9970: 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b  _VTAB";   break;
9980: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9990: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
99a0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20  NCTION:.        
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
99d0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
99e0: 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20  NT_FUNCTION";   
99f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9a00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9a10: 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a  RAINT_ROWID:   z
9a20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9a30: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22  ONSTRAINT_ROWID"
9a40: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
9a50: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
9a60: 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20  ATCH:           
9a70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9a80: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20  MISMATCH";      
9a90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9aa0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
9ab0: 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  USE:            
9ac0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9ad0: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20  _MISUSE";       
9ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9af0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
9b00: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
9b10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9b20: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
9b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9b40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
9b50: 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  UTH:            
9b60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9b70: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
9b80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9b90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9ba0: 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20  FORMAT:         
9bb0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9bc0: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
9bd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9be0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9bf0: 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20  _RANGE:         
9c00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9c10: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
9c20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9c30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9c40: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
9c50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9c60: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
9c70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9c80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9c90: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20  TE_ROW:         
9ca0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9cb0: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
9cc0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9cd0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9ce0: 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20  ITE_NOTICE:     
9cf0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9d00: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b  "SQLITE_NOTICE";
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9d20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9d30: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
9d40: 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d  VER_WAL: zName =
9d50: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
9d60: 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65  RECOVER_WAL";bre
9d70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9d80: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
9d90: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20  OVER_ROLLBACK:. 
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9dc0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
9dd0: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
9de0: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
9df0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9e00: 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20  E_WARNING:      
9e10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9e20: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20  QLITE_WARNING"; 
9e30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9e40: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9e50: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
9e60: 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  NDEX:  zName = "
9e70: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
9e80: 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  UTOINDEX"; break
9e90: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9ea0: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
9eb0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9ec0: 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20  "SQLITE_DONE";  
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9ee0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
9ef0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
9f00: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
9f10: 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
9f20: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9f30: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
9f40: 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57  , "SQLITE_UNKNOW
9f50: 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b  N(%d)", origRc);
9f60: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75  .    zName = zBu
9f70: 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  f;.  }.  return 
9f80: 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
9f90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
9fa0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
9fb0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
9fc0: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
9fd0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
9fe0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
9ff0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
a000: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
a010: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
a020: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
a030: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
a040: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
a050: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
a060: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
a070: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
a080: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
a090: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
a0a0: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
a0b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
a0c0: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
a0d0: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
a0e0: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
a0f0: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
a100: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a110: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
a120: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
a130: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
a140: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a150: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
a160: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
a170: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a180: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
a190: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
a1a0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
a1b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
a1c0: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
a1d0: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
a1e0: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
a1f0: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
a200: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
a210: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
a220: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
a230: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
a240: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
a250: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
a260: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
a270: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
a280: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
a290: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
a2a0: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
a2b0: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
a2c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
a2d0: 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f  UND    */ "unkno
a2e0: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20  wn operation",. 
a2f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
a300: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
a310: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
a320: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
a330: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
a340: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
a350: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
a360: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
a370: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
a380: 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  / "locking proto
a390: 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  col",.    /* SQL
a3a0: 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20  ITE_EMPTY       
a3b0: 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69  */ "table contai
a3c0: 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20  ns no data",.   
a3d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
a3e0: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
a3f0: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
a400: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
a410: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
a420: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
a430: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
a440: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
a450: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
a460: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
a470: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a480: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
a490: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
a4a0: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
a4b0: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
a4c0: 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e   "library routin
a4d0: 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20  e called out of 
a4e0: 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f  sequence",.    /
a4f0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
a500: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
a510: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
a520: 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a  isabled",.    /*
a530: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
a540: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
a550: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
a560: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
a570: 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78  MAT      */ "aux
a580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
a590: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20  format error",. 
a5a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
a5b0: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e  GE       */ "bin
a5c0: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
a5d0: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
a5e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
a5f0: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
a600: 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
a610: 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
a620: 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  abase",.  };.  c
a630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
a640: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
a650: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
a660: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
a670: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
a680: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
a690: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
a6a0: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
a6b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a6c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
a6d0: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
a6e0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
a6f0: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
a700: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
a710: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
a720: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
a730: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
a740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a750: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a760: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
a770: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
a780: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
a790: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
a7a0: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
a7b0: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
a7c0: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
a7d0: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
a7e0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
a7f0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
a800: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
a810: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
a820: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
a830: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a840: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
a850: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
a860: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
a870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
a880: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a890: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a8b0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
a8c0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
a8d0: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
a8e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
a8f0: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
a900: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
a910: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
a920: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
a930: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
a940: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
a950: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
a960: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
a970: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
a980: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
a990: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
a9a0: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
a9b0: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
a9c0: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
a9d0: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
a9e0: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
a9f0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
aa00: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
aa10: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
aa20: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
aa30: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
aa40: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
aa50: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
aa60: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
aa70: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
aa80: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
aa90: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
aaa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
aab0: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
aac0: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
aad0: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
aae0: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
aaf0: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
ab00: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
ab10: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
ab20: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
ab30: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
ab40: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
ab50: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ab60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
ab70: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
ab80: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
ab90: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
aba0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
abb0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
abc0: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
abd0: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
abe0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
abf0: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
ac00: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
ac10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ac20: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
ac30: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
ac40: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
ac50: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
ac60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
ac70: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
ac80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ac90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
aca0: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
acb0: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
acc0: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
acd0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
ace0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
acf0: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
ad00: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
ad10: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
ad20: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
ad30: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
ad40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ad50: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
ad60: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
ad70: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
ad80: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
ad90: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
ada0: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
adb0: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
adc0: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
add0: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
ade0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
adf0: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
ae00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
ae10: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
ae20: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
ae30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
ae40: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
ae50: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
ae60: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
ae70: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
ae80: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
ae90: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
aea0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
aeb0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
aec0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
aed0: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
aee0: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
aef0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
af00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
af10: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
af20: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
af30: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
af40: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
af50: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
af60: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
af70: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
af80: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
af90: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
afa0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
afb0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
afc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
afd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
afe0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
aff0: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
b000: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
b010: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
b020: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
b030: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
b040: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
b050: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
b060: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
b070: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
b080: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
b090: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
b0a0: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
b0b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b0c0: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
b0d0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
b0e0: 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20  , .  int nOps,. 
b0f0: 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73   int (*xProgress
b100: 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69  )(void*), .  voi
b110: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c  d *pArg.){.  sql
b120: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b130: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
b140: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
b150: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
b160: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
b170: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
b180: 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70   = (unsigned)nOp
b190: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
b1a0: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
b1b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
b1c0: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
b1d0: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
b1e0: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
b1f0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
b200: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
b210: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
b220: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
b230: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
b240: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
b250: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
b260: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
b270: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
b280: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
b290: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
b2a0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
b2b0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
b2c0: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
b2d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
b2e0: 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20  ms){.  if( ms>0 
b2f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
b300: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
b310: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
b320: 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  yCallback, (void
b330: 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62  *)db);.    db->b
b340: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b  usyTimeout = ms;
b350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b360: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
b370: 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  er(db, 0, 0);.  
b380: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
b390: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
b3a0: 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  ause any pending
b3b0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74   operation to st
b3c0: 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65  op at its earlie
b3d0: 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  st opportunity..
b3e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
b3f0: 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65  interrupt(sqlite
b400: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31  3 *db){.  db->u1
b410: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
b420: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
b430: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
b440: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
b450: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
b460: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
b470: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
b480: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
b490: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
b4a0: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
b4b0: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
b4c0: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
b4d0: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
b4e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
b4f0: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
b500: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
b510: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
b520: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
b530: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
b540: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
b550: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
b560: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b570: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
b580: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
b590: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
b5a0: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
b5b0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
b5c0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
b5d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
b5e0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
b5f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
b600: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
b610: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
b620: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
b630: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75  _context*),.  Fu
b640: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
b650: 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46  estructor.){.  F
b660: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
b670: 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78   nName;.  int ex
b680: 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73  traFlags;..  ass
b690: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b6a0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
b6b0: 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e  x) );.  if( zFun
b6c0: 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a  ctionName==0 ||.
b6d0: 20 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20        (xFunc && 
b6e0: 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70  (xFinal || xStep
b6f0: 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78  )) || .      (!x
b700: 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20  Func && (xFinal 
b710: 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20  && !xStep)) ||. 
b720: 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20       (!xFunc && 
b730: 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65  (!xFinal && xSte
b740: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41  p)) ||.      (nA
b750: 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51  rg<-1 || nArg>SQ
b760: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
b770: 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20  N_ARG) ||.      
b780: 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71  (255<(nName = sq
b790: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a  lite3Strlen30( z
b7a0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20  FunctionName))) 
b7b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
b7c0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
b7d0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
b7e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
b7f0: 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45  STANT==SQLITE_DE
b800: 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20  TERMINISTIC );. 
b810: 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e   extraFlags = en
b820: 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45  c &  SQLITE_DETE
b830: 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63  RMINISTIC;.  enc
b840: 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43   &= (SQLITE_FUNC
b850: 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f  _ENCMASK|SQLITE_
b860: 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66  ANY);.  .#ifndef
b870: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
b880: 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  16.  /* If SQLIT
b890: 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
b8a0: 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
b8b0: 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
b8c0: 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
b8d0: 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
b8e0: 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
b8f0: 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
b900: 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
b910: 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
b920: 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
b930: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
b940: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  rnally..  **.  *
b950: 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20  * If SQLITE_ANY 
b960: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64  is specified, ad
b970: 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73  d three versions
b980: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
b990: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73  .  ** to the has
b9a0: 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  h table..  */.  
b9b0: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
b9c0: 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63  UTF16 ){.    enc
b9d0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
b9e0: 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69  ATIVE;.  }else i
b9f0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41  f( enc==SQLITE_A
ba00: 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  NY ){.    int rc
ba10: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
ba20: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
ba30: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
ba40: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
ba50: 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20  8|extraFlags,.  
ba60: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
ba70: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
ba80: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
ba90: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tor);.    if( rc
baa0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bab0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bac0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
bad0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
bae0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
baf0: 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  6LE|extraFlags,.
bb00: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
bb10: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
bb20: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
bb30: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
bb40: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bb50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
bb60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
bb70: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
bb80: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
bb90: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
bba0: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
bbb0: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
bbc0: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
bbd0: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
bbe0: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
bbf0: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
bc00: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
bc10: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
bc20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
bc30: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
bc40: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
bc50: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
bc60: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
bc70: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
bc80: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
bc90: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
bca0: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
bcb0: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
bcc0: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
bcd0: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
bce0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
bcf0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
bd00: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
bd10: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
bd20: 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46  ( p && (p->funcF
bd30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
bd40: 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63  NC_ENCMASK)==enc
bd50: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
bd60: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
bd70: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
bd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bd90: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
bda0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
bdb0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
bdc0: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
bdd0: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
bde0: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
bdf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
be00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
be10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
be20: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
be30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
be40: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
be50: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
be60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
be70: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
be80: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
be90: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
bea0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
beb0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
bec0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
bed0: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
bee0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
bef0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
bf00: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
bf10: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
bf20: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
bf30: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
bf40: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
bf50: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
bf60: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
bf70: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
bf80: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
bf90: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
bfa0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
bfb0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
bfc0: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
bfd0: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
bfe0: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
bff0: 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  ;.  p->funcFlags
c000: 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73   = (p->funcFlags
c010: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
c020: 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46  NCMASK) | extraF
c030: 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65  lags;.  testcase
c040: 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  ( p->funcFlags &
c050: 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
c060: 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46  ISTIC );.  p->xF
c070: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
c080: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
c090: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
c0a0: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
c0b0: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
c0c0: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
c0d0: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
c0e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
c100: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
c110: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
c120: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c130: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
c140: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
c150: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
c160: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
c170: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
c180: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
c190: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
c1a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c1b0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
c1c0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
c1d0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c1e0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
c1f0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
c200: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
c210: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
c220: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c230: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
c240: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
c250: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
c290: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
c2a0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
c2b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
c2c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
c2d0: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
c2e0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
c2f0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
c300: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
c310: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c320: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
c330: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
c340: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
c350: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
c360: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
c370: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
c380: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
c390: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
c3a0: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
c3b0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
c3c0: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
c3d0: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71   *pArg = 0;.  sq
c3e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c3f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c400: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
c410: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
c420: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
c430: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
c440: 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63  (db, sizeof(Func
c450: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
c460: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
c470: 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29       xDestroy(p)
c480: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74  ;.      goto out
c490: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67  ;.    }.    pArg
c4a0: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
c4b0: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
c4c0: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
c4d0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
c4e0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c4f0: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
c500: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
c510: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67  ep, xFinal, pArg
c520: 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26  );.  if( pArg &&
c530: 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29   pArg->nRef==0 )
c540: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
c550: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
c560: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
c570: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c580: 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d  e(db, pArg);.  }
c590: 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73  .. out:.  rc = s
c5a0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
c5b0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
c5c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
c5d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
c5e0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
c5f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
c600: 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  16.int sqlite3_c
c610: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
c620: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
c630: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
c640: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
c650: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
c660: 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64  eTextRep,.  void
c670: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
c680: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
c690: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c6a0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c6b0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
c6c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c6d0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
c6e0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
c6f0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
c700: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
c710: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
c720: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
c730: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
c740: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
c750: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c760: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
c770: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
c780: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
c790: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
c7a0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
c7b0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
c7c0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
c7d0: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
c7e0: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
c7f0: 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71   xFinal,0);.  sq
c800: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c810: 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
c820: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
c830: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
c840: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
c850: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
c860: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
c870: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
c880: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
c890: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
c8a0: 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
c8b0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
c8c0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
c8d0: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
c8e0: 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
c8f0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
c900: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
c910: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
c920: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
c930: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
c940: 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
c950: 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
c960: 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
c970: 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
c980: 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
c990: 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
c9a0: 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
c9b0: 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
c9c0: 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
c9d0: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
c9e0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
c9f0: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
ca00: 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
ca10: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
ca20: 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
ca30: 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
ca40: 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
ca50: 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
ca60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
ca70: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
ca80: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
ca90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
caa0: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
cab0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
cac0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
cad0: 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20  Name);.  int rc 
cae0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
caf0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
cb00: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
cb10: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
cb20: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
cb30: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
cb40: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
cb50: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
cb60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
cb70: 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  c(db, zName, nAr
cb80: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cba0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
cbb0: 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
cbc0: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tion, 0, 0, 0);.
cbd0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
cbe0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
cbf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
cc00: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
cc10: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
cc20: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
cc30: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
cc40: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
cc50: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
cc60: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
cc70: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
cc80: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
cc90: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
cca0: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
ccb0: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
ccc0: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
ccd0: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
cce0: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
ccf0: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
cd00: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
cd10: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
cd20: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
cd30: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
cd40: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ement..*/.void *
cd50: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
cd60: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
cd70: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
cd80: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
cd90: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
cda0: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
cdb0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
cdc0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
cdd0: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
cde0: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
cdf0: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
ce00: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
ce10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ce20: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ce30: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
ce40: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
ce50: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
ce60: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
ce70: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
ce80: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
ce90: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
cea0: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
ceb0: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
cec0: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
ced0: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
cee0: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
cef0: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
cf00: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
cf10: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
cf20: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
cf30: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
cf40: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
cf50: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
cf60: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
cf70: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
cf80: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
cf90: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
cfa0: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
cfb0: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
cfc0: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
cfd0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
cfe0: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
cff0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d000: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d010: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
d020: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
d030: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
d040: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
d050: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
d060: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d070: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d080: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
d090: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d0a0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
d0b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
d0c0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
d0d0: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
d0e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
d0f0: 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mits..** If the 
d100: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
d110: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
d120: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
d130: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
d140: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
d150: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
d160: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
d170: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d180: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d190: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d1a0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
d1b0: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
d1c0: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
d1d0: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
d1e0: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
d1f0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d210: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d220: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d230: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
d240: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d250: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d260: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
d270: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
d280: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
d290: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
d2a0: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
d2b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d2c0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
d2d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
d2e0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
d2f0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
d300: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
d310: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
d320: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
d330: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
d340: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
d350: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
d360: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
d370: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
d380: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
d3a0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
d3b0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
d3c0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
d3d0: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
d3e0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
d3f0: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
d400: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
d410: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
d420: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
d430: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
d440: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
d450: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
d460: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d470: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
d480: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
d490: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
d4a0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
d4b0: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
d4c0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
d4d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d4e0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d4f0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
d500: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
d510: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
d520: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
d530: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
d540: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
d550: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
d560: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
d570: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
d580: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
d590: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
d5b0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
d5c0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
d5d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
d5e0: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
d5f0: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
d600: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
d610: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
d620: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
d630: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
d640: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
d650: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d660: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d670: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
d680: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
d690: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
d6a0: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d6b0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
d6c0: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
d6d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d6e0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d6f0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
d700: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d710: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
d720: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
d730: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
d740: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
d750: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
d760: 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
d770: 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
d780: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
d790: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
d7a0: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
d7b0: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
d7c0: 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
d7d0: 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
d7e0: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
d7f0: 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
d800: 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
d810: 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
d820: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
d830: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
d840: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
d850: 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
d860: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
d870: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
d880: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
d890: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
d8a0: 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
d8b0: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
d8c0: 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
d8d0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
d8e0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
d8f0: 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
d900: 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
d910: 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
d920: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
d930: 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
d940: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
d950: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
d960: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
d970: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
d980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d990: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d9a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
d9b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
d9c0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
d9d0: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
d9e0: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
d9f0: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
da00: 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
da10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
da20: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
da30: 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
da40: 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
da50: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
da60: 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
da70: 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
da80: 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
da90: 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
daa0: 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
dab0: 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
dac0: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
dad0: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
dae0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
daf0: 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
db00: 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
db10: 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
db20: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
db30: 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
db40: 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
db50: 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
db60: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
db70: 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
db80: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
db90: 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
dba0: 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
dbb0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
dbc0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
dbd0: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
dbe0: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
dbf0: 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
dc00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
dc10: 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
dc20: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
dc30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
dc40: 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
dc50: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20  .  if( nFrame>0 
dc60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
dc70: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69  al_hook(db, sqli
dc80: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
dc90: 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  k, SQLITE_INT_TO
dca0: 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20  _PTR(nFrame));. 
dcb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
dcc0: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
dcd0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
dce0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
dcf0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dd00: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
dd10: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
dd20: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
dd30: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69  ansaction is wri
dd40: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  tten.** into the
dd50: 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
dd60: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
dd70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
dd80: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77  .void *sqlite3_w
dd90: 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  al_hook(.  sqlit
dda0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
ddb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
ddc0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
ddd0: 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20   this db handle 
dde0: 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62  */.  int(*xCallb
ddf0: 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c  ack)(void *, sql
de00: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
de10: 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64  r*, int),.  void
de20: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
de30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
de40: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
de50: 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63  ssed to xCallbac
de60: 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  k() */.){.#ifnde
de70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
de80: 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  L.  void *pRet;.
de90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
dea0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
deb0: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
dec0: 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
ded0: 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
dee0: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
def0: 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
df00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
df10: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
df20: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
df30: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
df40: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
df50: 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
df60: 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
df70: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
df80: 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
df90: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dfb0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
dfc0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
dfd0: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
dfe0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
dff0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
e000: 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
e010: 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
e040: 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
e050: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
e080: 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
e090: 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
e0a0: 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
e0b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
e0c0: 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
e0d0: 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
e0e0: 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
e0f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e100: 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
e110: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
e120: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e150: 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
e160: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
e170: 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
e180: 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
e190: 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
e1a0: 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  /..  /* Initiali
e1b0: 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
e1c0: 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
e1d0: 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
e1e0: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
e1f0: 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
e200: 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
e210: 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
e220: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
e230: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
e240: 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ULL>SQLITE_CHECK
e250: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b  POINT_PASSIVE );
e260: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
e270: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
e280: 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  L<SQLITE_CHECKPO
e290: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20  INT_RESTART );. 
e2a0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
e2b0: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
e2c0: 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45  VE+2==SQLITE_CHE
e2d0: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
e2e0: 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
e2f0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e300: 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
e310: 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
e320: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20  INT_RESTART ){. 
e330: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e340: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
e350: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e360: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e370: 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
e380: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
e390: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
e3a0: 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
e3b0: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
e3c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e3d0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
e3e0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
e3f0: 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
e400: 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
e410: 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
e420: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e430: 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
e440: 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
e450: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
e460: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
e470: 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72   rc, 0);.  }.  r
e480: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
e490: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
e4a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e4b0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
e4c0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
e4d0: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
e4e0: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
e4f0: 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
e500: 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
e510: 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
e520: 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
e530: 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
e540: 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
e550: 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
e560: 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
e570: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e580: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
e590: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
e5a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
e5b0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e5c0: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
e5d0: 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  v2(db, zDb, SQLI
e5e0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
e5f0: 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a  SSIVE, 0, 0);.}.
e600: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e610: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52  OMIT_WAL./*.** R
e620: 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  un a checkpoint 
e630: 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  on database iDb.
e640: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
e650: 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62   if database iDb
e660: 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65   is.** not curre
e670: 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c  ntly open in WAL
e680: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
e690: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
e6a0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
e6b0: 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63  abase being chec
e6c0: 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a  kpointed, this .
e6d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
e6e0: 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
e6f0: 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69  D and a checkpoi
e700: 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  nt is not attemp
e710: 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ted. If .** an e
e720: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
e730: 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68  e running the ch
e740: 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c  eckpoint, an SQL
e750: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
e760: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28  s .** returned (
e770: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  i.e. SQLITE_IOER
e780: 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  R). Otherwise, S
e790: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
e7a0: 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  The mutex on dat
e7b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20  abase handle db 
e7c0: 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62  should be held b
e7d0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  y the caller. Th
e7e0: 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63  e mutex.** assoc
e7f0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
e800: 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62  pecific b-tree b
e810: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
e820: 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a  d is taken by.**
e830: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
e840: 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f  hile the checkpo
e850: 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  int is running..
e860: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20  **.** If iDb is 
e870: 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41  passed SQLITE_MA
e880: 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e  X_ATTACHED, then
e890: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
e8a0: 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63  tabases are.** c
e8b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20  heckpointed. If 
e8c0: 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
e8d0: 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65  untered it is re
e8e0: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
e8f0: 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d  ly -.** no attem
e900: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
e910: 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d  eckpoint any rem
e920: 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73  aining databases
e930: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
e940: 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f  r eMode is one o
e950: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
e960: 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
e970: 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f  L or RESTART..*/
e980: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
e990: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
e9a0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
e9b0: 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
e9c0: 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
e9d0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e9e0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e9f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
ea00: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
ea30: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
ea40: 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
ea50: 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
ea60: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ea70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
ea80: 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
ea90: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
eaa0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
eab0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
eac0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
ead0: 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
eae0: 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
eaf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
eb00: 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
eb10: 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
eb20: 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
eb30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
eb40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
eb50: 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
eb60: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
eb70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
eb80: 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
eb90: 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
eba0: 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
ebb0: 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
ebc0: 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
ebd0: 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
ebe0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ebf0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
ec00: 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
ec10: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ec20: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
ec30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
ec40: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
ec50: 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
ec60: 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
ec70: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ec80: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
ec90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
eca0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
ecb0: 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
ecc0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
ecd0: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
ece0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
ecf0: 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
ed00: 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
ed10: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
ed20: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
ed30: 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
ed40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
ed50: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
ed60: 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
ed70: 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
ed80: 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
ed90: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
eda0: 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
edb0: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
edc0: 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
edd0: 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
ede0: 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
edf0: 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
ee00: 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
ee10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
ee20: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
ee30: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
ee40: 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
ee50: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
ee60: 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
ee70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
ee80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
ee90: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
eeb0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
eec0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
eee0: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
eef0: 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
ef30: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
ef60: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
ef70: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
efa0: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
efb0: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
efc0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
efd0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
efe0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
eff0: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
f000: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
f010: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
f030: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
f040: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
f080: 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
f0b0: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
f0c0: 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
f0d0: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
f0e0: 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
f0f0: 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
f100: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
f110: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
f120: 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
f130: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
f140: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
f150: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
f160: 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
f170: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
f180: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
f190: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
f1a0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
f1b0: 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51  MP_STORE<1 || SQ
f1c0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e  LITE_TEMP_STORE>
f1d0: 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  3.  return 0;.#e
f1e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
f1f0: 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
f200: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
f210: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
f220: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
f230: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
f240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
f250: 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
f260: 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
f270: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
f280: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
f290: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
f2a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
f2b0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
f2c0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
f2d0: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
f2e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
f2f0: 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
f300: 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  SE_BKPT);.  }.  
f310: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f320: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f330: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f340: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
f350: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
f360: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
f370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74   }else{.    test
f380: 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d  case( db->pErr==
f390: 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  0 );.    z = (ch
f3a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
f3b0: 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
f3c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
f3d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f3e0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
f3f0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
f400: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
f410: 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
f420: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f430: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f440: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
f450: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f460: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
f470: 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
f480: 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
f490: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
f4a0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
f4b0: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
f4c0: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
f4d0: 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
f4e0: 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
f4f0: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
f500: 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
f510: 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
f520: 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
f530: 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
f540: 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
f550: 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
f560: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
f570: 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
f580: 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62      'l', 'i', 'b
f590: 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27  ', 'r', 'a', 'r'
f5a0: 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'y', ' ', .   
f5b0: 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20   'r', 'o', 'u', 
f5c0: 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27  't', 'i', 'n', '
f5d0: 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63  e', ' ', .    'c
f5e0: 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27  ', 'a', 'l', 'l'
f5f0: 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c  , 'e', 'd', ' ',
f600: 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20   .    'o', 'u', 
f610: 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  't', ' ', .    '
f620: 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20  o', 'f', ' ', . 
f630: 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27     's', 'e', 'q'
f640: 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c  , 'u', 'e', 'n',
f650: 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d   'c', 'e', 0.  }
f660: 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ;..  const void 
f670: 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
f680: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
f690: 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
f6a0: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
f6b0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
f6c0: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
f6d0: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69  eturn (void *)mi
f6e0: 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  suse;.  }.  sqli
f6f0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f700: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
f710: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f720: 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76  ed ){.    z = (v
f730: 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
f740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
f750: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f760: 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
f770: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
f780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f790: 72 6f 72 28 64 62 2c 20 64 62 2d 3e 65 72 72 43  ror(db, db->errC
f7a0: 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53  ode, sqlite3ErrS
f7b0: 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29  tr(db->errCode))
f7c0: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
f7d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
f7e0: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
f7f0: 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  }.    /* A mallo
f800: 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69  c() may have fai
f810: 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  led within the c
f820: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  all to sqlite3_v
f830: 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20  alue_text16().  
f840: 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
f850: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
f860: 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
f870: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
f880: 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
f890: 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
f8a0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20  e returning. Do 
f8b0: 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69  this directly, i
f8c0: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20  nstead of via.  
f8d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45    ** sqlite3ApiE
f8e0: 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20  xit(), to avoid 
f8f0: 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61  setting the data
f900: 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f  base handle erro
f910: 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a  r message..    *
f920: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
f930: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  Failed = 0;.  }.
f940: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f950: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
f960: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
f970: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f980: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
f990: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
f9a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
f9b0: 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
f9c0: 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
f9d0: 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
f9e0: 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
f9f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
fa00: 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
fa10: 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
fa20: 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
fa30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fa40: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
fa50: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
fa60: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
fa70: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
fa80: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
fa90: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
faa0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
fab0: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
fac0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
fad0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
fae0: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
faf0: 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
fb00: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
fb10: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
fb20: 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
fb30: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
fb40: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
fb50: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
fb60: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
fb70: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
fb80: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
fb90: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
fba0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
fbb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
fbc0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
fbd0: 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a   db->errCode;.}.
fbe0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
fbf0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
fc00: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
fc10: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
fc20: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
fc30: 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  ment.  For now, 
fc40: 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c  this simply call
fc50: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
fc60: 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a  qlite3ErrStr().*
fc70: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  * function..*/.c
fc80: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
fc90: 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63  e3_errstr(int rc
fca0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
fcb0: 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d  te3ErrStr(rc);.}
fcc0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
fcd0: 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20 4b 65  te all cached Ke
fce0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 66 6f  yInfo objects fo
fcf0: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
fd00: 63 74 69 6f 6e 20 22 64 62 22 0a 2a 2f 0a 73 74  ction "db".*/.st
fd10: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
fd20: 64 61 74 65 43 61 63 68 65 64 4b 65 79 49 6e 66  dateCachedKeyInf
fd30: 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  o(sqlite3 *db){.
fd40: 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd60: 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
fd70: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd90: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
fda0: 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
fdb0: 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
fdc0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
fdd0: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
fde0: 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
fdf0: 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
fe00: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
fe10: 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
fe20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
fe30: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
fe40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fe50: 20 2f 2a 20 45 61 63 68 20 69 6e 64 65 78 20 2a   /* Each index *
fe60: 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  /..  for(iDb=0, 
fe70: 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
fe80: 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
fe90: 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28   pDb++){.    if(
fea0: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 20 63   pDb->pBt==0 ) c
feb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
fec0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
fed0: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 66 6f  Db->pBt);.    fo
fee0: 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
fef0: 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
ff00: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
ff10: 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
ff20: 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
ff30: 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
ff40: 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
ff50: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
ff60: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
ff70: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
ff80: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
ff90: 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20   pIdx->pKeyInfo 
ffa0: 26 26 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66  && pIdx->pKeyInf
ffb0: 6f 2d 3e 64 62 3d 3d 64 62 20 29 7b 0a 20 20 20  o->db==db ){.   
ffc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
ffd0: 79 49 6e 66 6f 55 6e 72 65 66 28 70 49 64 78 2d  yInfoUnref(pIdx-
ffe0: 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
fff0: 20 20 20 20 20 20 70 49 64 78 2d 3e 70 4b 65 79        pIdx->pKey
10000 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  Info = 0;.      
10010 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10020 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
10030 65 65 4c 65 61 76 65 28 70 44 62 2d 3e 70 42 74  eeLeave(pDb->pBt
10040 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
10050 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c  Create a new col
10060 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
10070 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62  for database "db
10080 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20  ".  The name is 
10090 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65  zName.** and the
100a0 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63   encoding is enc
100b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
100c0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
100d0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a  .  sqlite3* db,.
100e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
100f0 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a  ame, .  u8 enc,.
10100 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
10110 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
10120 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
10130 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
10140 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
10150 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
10160 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
10170 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69  .  int enc2;.  i
10180 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  nt nName = sqlit
10190 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
101a0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
101b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
101c0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
101d0 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  ..  /* If SQLITE
101e0 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
101f0 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
10200 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
10210 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
10220 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
10230 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
10240 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
10250 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
10260 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
10270 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
10280 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
10290 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e  nally..  */.  en
102a0 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74  c2 = enc;.  test
102b0 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
102c0 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65  TE_UTF16 );.  te
102d0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
102e0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
102f0 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32  ED );.  if( enc2
10300 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c  ==SQLITE_UTF16 |
10310 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  | enc2==SQLITE_U
10320 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a  TF16_ALIGNED ){.
10330 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54      enc2 = SQLIT
10340 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
10350 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51   }.  if( enc2<SQ
10360 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
10370 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  2>SQLITE_UTF16BE
10380 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10390 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
103a0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
103b0 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
103c0 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
103d0 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
103e0 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
103f0 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
10400 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
10410 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
10420 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
10430 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
10440 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
10450 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
10460 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
10470 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ents..  */.  pCo
10480 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
10490 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
104a0 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  enc2, zName, 0);
104b0 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
104c0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
104d0 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
104e0 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
104f0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
10500 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
10510 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
10520 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
10530 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
10540 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  ce due to active
10550 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
10560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10570 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
10580 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
10590 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
105a0 74 73 28 64 62 29 3b 0a 20 20 20 20 69 6e 76 61  ts(db);.    inva
105b0 6c 69 64 61 74 65 43 61 63 68 65 64 4b 65 79 49  lidateCachedKeyI
105c0 6e 66 6f 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nfo(db);..    /*
105d0 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
105e0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
105f0 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
10600 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
10610 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
10620 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
10630 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
10640 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
10650 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
10660 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
10670 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
10680 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
10690 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
106a0 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
106b0 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
106c0 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
106d0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
106e0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
106f0 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
10700 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
10710 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
10720 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
10730 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
10740 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
10750 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
10760 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
10770 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
10780 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
10790 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
107a0 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
107b0 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
107c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
107d0 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
107e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
107f0 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
10800 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
10810 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
10820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10830 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
10840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10850 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
10860 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
10870 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
10880 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
10890 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
108a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
108b0 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  NOMEM;.  pColl->
108c0 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
108d0 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
108e0 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d  = pCtx;.  pColl-
108f0 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
10900 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38  pColl->enc = (u8
10910 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  )(enc2 | (enc & 
10920 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
10930 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65  GNED));.  sqlite
10940 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
10950 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75  E_OK, 0);.  retu
10960 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10970 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
10980 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
10990 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
109a0 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
109b0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
109c0 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
109d0 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
109e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
109f0 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
10a00 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
10a10 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
10a20 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
10a30 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
10a40 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
10a50 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
10a60 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
10a70 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
10a80 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
10a90 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
10aa0 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
10ab0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
10ac0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
10ad0 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
10ae0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
10af0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
10b00 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
10b10 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
10b20 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a  ARIABLE_NUMBER,.
10b30 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49    SQLITE_MAX_TRI
10b40 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a  GGER_DEPTH,.};..
10b50 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
10b60 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
10b70 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
10b80 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
10b90 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
10ba0 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
10bb0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
10bc0 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
10bd0 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
10be0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
10bf0 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
10c00 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10c10 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
10c20 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
10c30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10c40 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
10c50 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
10c60 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
10c70 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
10c80 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
10c90 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
10ca0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
10cb0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10cc0 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
10cd0 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
10ce0 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
10cf0 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
10d00 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
10d10 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10d20 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
10d30 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
10d40 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
10d50 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
10d60 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10d70 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
10d80 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
10d90 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a  NCTION_ARG>1000.
10da0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10db0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
10dc0 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
10dd0 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69  0 and 1000.#endi
10de0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10df0 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
10e00 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
10e10 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51  ED>62.# error SQ
10e20 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
10e30 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
10e40 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69  n 0 and 62.#endi
10e50 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10e60 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
10e70 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  NGTH<1.# error S
10e80 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
10e90 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75  ATTERN_LENGTH mu
10ea0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
10eb0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10ec0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32  TE_MAX_COLUMN>32
10ed0 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  767.# error SQLI
10ee0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75  TE_MAX_COLUMN mu
10ef0 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32  st not exceed 32
10f00 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  767.#endif.#if S
10f10 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
10f20 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f  R_DEPTH<1.# erro
10f30 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  r SQLITE_MAX_TRI
10f40 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20  GGER_DEPTH must 
10f50 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
10f60 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
10f70 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
10f80 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72   a limit.  Repor
10f90 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e  t the old value.
10fa0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69  .** If an invali
10fb0 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73  d limit index is
10fc0 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72   supplied, repor
10fd0 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  t -1..** Make no
10fe0 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69   changes but sti
10ff0 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c  ll report the ol
11000 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a  d value if the.*
11010 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e  * new limit is n
11020 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41  egative..**.** A
11030 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74   new lower limit
11040 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b   does not shrink
11050 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72   existing constr
11060 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65  ucts..** It mere
11070 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20  ly prevents new 
11080 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20  constructs that 
11090 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74  exceed the limit
110a0 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67  .** from forming
110b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
110c0 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  _limit(sqlite3 *
110d0 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c  db, int limitId,
110e0 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a   int newLimit){.
110f0 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a    int oldLimit;.
11100 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
11110 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
11120 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
11130 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
11140 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
11150 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
11160 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
11170 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
11180 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
11190 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
111a0 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
111b0 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
111c0 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
111d0 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
111e0 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
111f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
11200 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
11210 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
11220 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
11230 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
11240 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
11250 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
11260 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
11270 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
11280 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
11290 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
112a0 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
112b0 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
112c0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
112d0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
112e0 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
112f0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
11300 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
11310 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
11320 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
11330 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
11340 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
11350 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
11360 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11370 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
11380 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
11390 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
113a0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
113b0 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
113c0 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
113d0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
113e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
113f0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
11400 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
11410 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
11420 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
11430 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
11440 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
11450 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
11460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
114a0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
114b0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
114c0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
114d0 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
114e0 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
114f0 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
11500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
11510 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11520 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
11530 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
11540 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
11550 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
11560 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
11570 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e  DEPTH==(SQLITE_N
11580 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
11590 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
115a0 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
115b0 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
115c0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
115d0 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
115e0 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
115f0 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
11600 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
11610 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
11620 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
11630 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
11640 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
11650 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
11660 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
11670 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
11680 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
11690 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
116a0 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
116b0 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
116c0 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
116d0 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
116f0 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
11700 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
11710 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11720 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
11730 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
11740 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
11750 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
11760 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
11770 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
11780 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
11790 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
117a0 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
117b0 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
117c0 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
117d0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
117e0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
117f0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
11800 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
11810 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
11820 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
11830 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
11840 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
11850 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
11860 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
11870 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
11880 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
11890 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
118a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
118b0 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
118c0 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
118d0 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
118e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
118f0 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
11900 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
11910 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
11920 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
11930 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
11940 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
11950 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
11960 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
11970 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
11980 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
11990 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
119a0 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
119b0 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
119c0 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
119d0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
119e0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
119f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11a00 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
11a10 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
11a20 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
11a30 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
11a40 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
11a50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11a60 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
11a70 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
11a80 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
11a90 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
11aa0 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
11ab0 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
11ac0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
11ad0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
11ae0 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
11af0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
11b00 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
11b10 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
11b20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11b30 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
11b40 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
11b50 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
11b60 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
11b70 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
11b80 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
11b90 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
11ba0 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
11bb0 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
11bc0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
11bd0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
11be0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
11bf0 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
11c00 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
11c10 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
11c20 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
11c30 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
11c40 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
11c50 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
11c60 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
11c70 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
11c80 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
11c90 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cb0 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
11cc0 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
11cd0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
11ce0 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
11cf0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
11d00 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
11d10 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
11d20 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
11d30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11d40 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
11d50 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
11d80 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
11d90 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
11da0 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
11db0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11dc0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
11dd0 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
11de0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
11df0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11e00 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
11e10 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
11e20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
11e30 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
11e40 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
11e50 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
11e60 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
11e70 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
11e80 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
11e90 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
11ea0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
11eb0 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69  PEN_URI) || sqli
11ec0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11ed0 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26  bOpenUri) .   &&
11ee0 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63   nUri>=5 && memc
11ef0 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22  mp(zUri, "file:"
11f00 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  , 5)==0 .  ){.  
11f10 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
11f20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
11f50 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
11f60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
11f90 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
11fa0 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
11fb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11fc0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
11fd0 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
11fe0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
11ff0 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
12000 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
12010 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
12020 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
12030 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
12040 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
12050 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
12060 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
12070 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
12080 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
12090 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
120a0 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
120b0 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
120c0 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
120d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
120e0 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
120f0 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
12100 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
12110 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
12120 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
12130 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
12140 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
12150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12160 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20  MEM;..    iIn = 
12170 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  5;.#ifndef SQLIT
12180 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48  E_ALLOW_URI_AUTH
12190 4f 52 49 54 59 0a 20 20 20 20 2f 2a 20 44 69 73  ORITY.    /* Dis
121a0 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
121b0 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
121c0 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
121d0 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
121e0 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
121f0 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
12200 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
12210 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
12220 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
12230 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='/' ) iIn++;. 
12240 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
12250 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
12260 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
12270 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
12280 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
12290 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
122a0 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
122b0 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
122c0 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
122d0 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
122e0 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
122f0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
12300 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
12310 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
12320 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
12330 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  f..    /* Copy t
12340 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
12350 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65  any query parame
12360 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46  ters into the zF
12370 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20  ile buffer. .   
12380 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65   ** Decode %HH e
12390 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e  scape codes alon
123a0 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20  g the way. .    
123b0 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e  **.    ** Within
123c0 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69   this loop, vari
123d0 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20  able eState may 
123e0 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f  be set to 0, 1 o
123f0 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20  r 2, depending. 
12400 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72     ** on the par
12410 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73  sing context. As
12420 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
12430 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72  .    **   0: Par
12440 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a  sing file-name..
12450 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73      **   1: Pars
12460 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e  ing name section
12470 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
12480 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
12490 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61  ..    **   2: Pa
124a0 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74  rsing value sect
124b0 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
124c0 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
124d0 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ter..    */.    
124e0 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
124f0 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
12500 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
12510 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '#' ){.      iIn
12520 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
12530 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20  ='%' .       && 
12540 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
12550 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20  zUri[iIn]) .    
12560 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
12570 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31  digit(zUri[iIn+1
12580 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ]) .      ){.   
12590 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d       int octet =
125a0 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e   (sqlite3HexToIn
125b0 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c  t(zUri[iIn++]) <
125c0 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63  < 4);.        oc
125d0 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65  tet += sqlite3He
125e0 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
125f0 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  +]);..        as
12600 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26  sert( octet>=0 &
12610 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20  & octet<256 );. 
12620 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74         if( octet
12630 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12640 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
12650 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25  is taken when "%
12660 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68  00" appears with
12670 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74  in the URI. In t
12680 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
12690 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20   case we ignore 
126a0 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20  all text in the 
126b0 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
126c0 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20   path, name or. 
126d0 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
126e0 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
126f0 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e  g parsed. So ign
12700 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
12710 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20  character.      
12720 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20      ** and skip 
12730 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c  to the next "?",
12740 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20   "=" or "&", as 
12750 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a  appropriate. */.
12760 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
12770 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
12780 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20  !=0 && c!='#' . 
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
127a0 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21  (eState!=0 || c!
127b0 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='?').          
127c0 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
127d0 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20  1 || (c!='=' && 
127e0 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20  c!='&')).       
127f0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
12800 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a  e!=2 || c!='&').
12810 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
12820 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a           iIn++;.
12830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12840 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
12850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12860 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20    c = octet;.   
12870 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
12880 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26  ate==1 && (c=='&
12890 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a  ' || c=='=') ){.
128a0 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
128b0 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a  e[iOut-1]==0 ){.
128c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
128d0 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d  empty option nam
128e0 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f  e. Ignore this o
128f0 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72  ption altogether
12900 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
12910 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20  hile( zUri[iIn] 
12920 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23  && zUri[iIn]!='#
12930 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d  ' && zUri[iIn-1]
12940 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='&' ) iIn++;. 
12950 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
12960 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
12970 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20       if( c=='&' 
12980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69  ){.          zFi
12990 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
129a0 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ';.        }else
129b0 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
129c0 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
129d0 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  }.        c = 0;
129e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
129f0 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63   (eState==0 && c
12a00 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74  =='?') || (eStat
12a10 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20  e==2 && c=='&') 
12a20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30  ){.        c = 0
12a30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  ;.        eState
12a40 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
12a50 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
12a60 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = c;.    }.   
12a70 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29   if( eState==1 )
12a80 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
12a90 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
12aa0 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
12ab0 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
12ac0 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  +] = '\0';..    
12ad0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72  /* Check if ther
12ae0 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f  e were any optio
12af0 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61  ns specified tha
12b00 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65  t should be inte
12b10 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20  rpreted .    ** 
12b20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68  here. Options th
12b30 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74  at are interpret
12b40 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20  ed here include 
12b50 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20  "vfs" and those 
12b60 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72  that.    ** corr
12b70 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20  espond to flags 
12b80 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73  that may be pass
12b90 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
12ba0 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20  3_open_v2().    
12bb0 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20  ** method. */.  
12bc0 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b    zOpt = &zFile[
12bd0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12be0 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77  zFile)+1];.    w
12bf0 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b  hile( zOpt[0] ){
12c00 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20  .      int nOpt 
12c10 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12c20 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63  0(zOpt);.      c
12c30 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70  har *zVal = &zOp
12c40 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20  t[nOpt+1];.     
12c50 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
12c60 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c  te3Strlen30(zVal
12c70 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  );..      if( nO
12c80 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28  pt==3 && memcmp(
12c90 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d  "vfs", zOpt, 3)=
12ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56  =0 ){.        zV
12cb0 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20  fs = zVal;.     
12cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12cd0 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
12ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
12cf0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
12d00 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20       int mode;. 
12d10 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20         } *aMode 
12d20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
12d30 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30  r *zModeType = 0
12d40 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61  ;.        int ma
12d50 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
12d60 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a  int limit = 0;..
12d70 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
12d80 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63  ==5 && memcmp("c
12d90 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d  ache", zOpt, 5)=
12da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12db0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
12dc0 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64  enMode aCacheMod
12dd0 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
12de0 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20      { "shared", 
12df0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
12e00 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  REDCACHE },.    
12e10 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61          { "priva
12e20 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  te", SQLITE_OPEN
12e30 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c  _PRIVATECACHE },
12e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
12e50 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
12e60 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
12e70 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
12e80 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c  _SHAREDCACHE|SQL
12e90 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
12ea0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20  CACHE;.         
12eb0 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d   aMode = aCacheM
12ec0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
12ed0 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20  imit = mask;.   
12ee0 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
12ef0 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20   = "cache";.    
12f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12f10 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d  ( nOpt==4 && mem
12f20 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74  cmp("mode", zOpt
12f30 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
12f40 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
12f50 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65  ct OpenMode aOpe
12f60 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  nMode[] = {.    
12f70 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20          { "ro", 
12f80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
12f90 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20  DONLY },.       
12fa0 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51       { "rw",  SQ
12fb0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12fc0 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20  ITE }, .        
12fd0 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c      { "rwc", SQL
12fe0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12ff0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
13000 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20  _CREATE },.     
13010 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79         { "memory
13020 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
13030 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20  EMORY },.       
13040 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
13050 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
13060 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
13070 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
13080 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y | SQLITE_OPEN_
13090 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20  READWRITE.      
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
130b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
130c0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
130d0 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20  MEMORY;.        
130e0 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d    aMode = aOpenM
130f0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
13100 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c  imit = mask & fl
13110 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ags;.          z
13120 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65  ModeType = "acce
13130 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ss";.        }..
13140 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64          if( aMod
13150 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
13160 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
13170 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  int mode = 0;.  
13180 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
13190 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b   aMode[i].z; i++
131a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
131b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
131c0 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20  Mode[i].z;.     
131d0 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d         if( nVal=
131e0 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
131f0 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  (z) && 0==memcmp
13200 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20  (zVal, z, nVal) 
13210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13220 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d   mode = aMode[i]
13230 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  .mode;.         
13240 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13260 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13270 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20  if( mode==0 ){. 
13280 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
13290 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
132a0 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
132b0 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d  %s mode: %s", zM
132c0 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
132d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
132e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
132f0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
13300 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
13310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13320 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26       if( (mode &
13330 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45   ~SQLITE_OPEN_ME
13340 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20  MORY)>limit ){. 
13350 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
13360 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
13370 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20  printf("%s mode 
13380 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22  not allowed: %s"
13390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133b0 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
133c0 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
133d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
133e0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
133f0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
13400 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
13410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13420 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  flags = (flags &
13430 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a   ~mask) | mode;.
13440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13450 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20  }..      zOpt = 
13460 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20  &zVal[nVal+1];. 
13470 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
13480 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
13490 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32  e3_malloc(nUri+2
134a0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
134b0 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
134c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
134d0 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c  cpy(zFile, zUri,
134e0 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c   nUri);.    zFil
134f0 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
13500 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
13510 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
13520 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
13530 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
13540 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
13550 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
13560 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
13570 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
13580 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
13590 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
135a0 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
135b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
135c0 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
135d0 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
135e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
135f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13600 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
13610 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
13620 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
13630 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
13640 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13650 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
13660 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
13670 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
13680 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
13690 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
136a0 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
136b0 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
136c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
136d0 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
136e0 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
136f0 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
13700 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
13710 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
13720 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
13730 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
13740 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
13750 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
13760 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
13770 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
13780 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
13790 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
137a0 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
137b0 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
137c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
137d0 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
137e0 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
137f0 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
13800 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
13810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13820 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
13830 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
13840 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
13870 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
13880 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
13890 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
138a0 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
138b0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
138c0 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
138d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
138e0 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
138f0 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
13900 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
13910 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13930 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
13940 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
13950 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62  ri() */..  *ppDb
13960 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
13970 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
13980 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
13990 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
139a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
139b0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
139c0 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65  /* Only allow se
139d0 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
139e0 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74  ons of bits in t
139f0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
13a00 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20  t.  .  ** Throw 
13a10 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
13a20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e  non-sense combin
13a30 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20  ation is used.  
13a40 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f  If we.  ** do no
13a50 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20  t block illegal 
13a60 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72  combinations her
13a70 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67  e, it could trig
13a80 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  ger.  ** assert(
13a90 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
13aa0 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20  deeper layers.  
13ab0 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  Sensible combina
13ac0 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a  tions.  ** are:.
13ad0 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53    **.  **  1:  S
13ae0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
13af0 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51  NLY.  **  2:  SQ
13b00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13b10 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51  ITE.  **  6:  SQ
13b20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13b30 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
13b40 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20  N_CREATE.  */.  
13b50 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
13b60 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d  PEN_READONLY  ==
13b70 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72   0x01 );.  asser
13b80 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
13b90 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32  EADWRITE == 0x02
13ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
13bb0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13bc0 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20      == 0x04 );. 
13bd0 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
13be0 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20  flags&7))==0x02 
13bf0 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a  ); /* READONLY *
13c00 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
13c10 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
13c20 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  04 ); /* READWRI
13c30 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  TE */.  testcase
13c40 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
13c50 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41  ==0x40 ); /* REA
13c60 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
13c70 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66  */.  if( ((1<<(f
13c80 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29  lags&7)) & 0x46)
13c90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13ca0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
13cb0 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
13cc0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
13cd0 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
13ce0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
13cf0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
13d00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13d10 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
13d20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
13d30 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
13d40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
13d50 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
13d60 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
13d70 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
13d80 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
13d90 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
13da0 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
13db0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  x;.  }.  if( fla
13dc0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13dd0 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b  _PRIVATECACHE ){
13de0 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
13df0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
13e00 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20  DCACHE;.  }else 
13e10 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
13e20 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
13e30 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
13e40 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
13e50 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
13e60 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  HE;.  }..  /* Re
13e70 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74  move harmful bit
13e80 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73  s from the flags
13e90 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a   parameter.  **.
13ea0 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    ** The SQLITE_
13eb0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64  OPEN_NOMUTEX and
13ec0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
13ed0 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72  LMUTEX flags wer
13ee0 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  e.  ** dealt wit
13ef0 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  h in the previou
13f00 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42  s code block.  B
13f10 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68  esides these, th
13f20 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69  e only.  ** vali
13f30 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f  d input flags fo
13f40 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
13f50 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f  2() are SQLITE_O
13f60 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20  PEN_READONLY,.  
13f70 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ** SQLITE_OPEN_R
13f80 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45  EADWRITE, SQLITE
13f90 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51  _OPEN_CREATE, SQ
13fa0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
13fb0 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49  CACHE,.  ** SQLI
13fc0 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
13fd0 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72  ACHE, and some r
13fe0 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53  eserved bits.  S
13ff0 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
14000 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
14010 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
14020 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
14030 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
14040 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
14050 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14060 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14080 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
14090 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
140a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
140b0 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
140c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
140d0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
140e0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
140f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
14100 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14120 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
14130 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
14140 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14150 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
14160 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
14170 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
14180 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
141a0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
141b0 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
141c0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
141d0 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  ULLMUTEX |.     
141e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
141f0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20  _OPEN_WAL.      
14200 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20         );..  /* 
14210 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
14220 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
14230 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
14240 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
14250 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20  sizeof(sqlite3) 
14260 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
14270 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14280 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64  ;.  if( isThread
14290 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  safe ){.    db->
142a0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
142b0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
142c0 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
142d0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
142e0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
142f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
14300 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
14310 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
14320 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
14330 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
14340 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
14350 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
14360 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
14370 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d  nDb = 2;.  db->m
14380 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
14390 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e  GIC_BUSY;.  db->
143a0 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
143b0 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tic;..  assert( 
143c0 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
143d0 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
143e0 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
143f0 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
14400 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
14410 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
14420 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14430 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
14440 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
14450 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c  db->szMmap = sql
14460 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14470 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e  .szMmap;.  db->n
14480 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
14490 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65  .  db->nMaxSorte
144a0 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46  rMmap = 0x7FFFFF
144b0 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  FF;.  db->flags 
144c0 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
144d0 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
144e0 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c  _EnableTrigger |
144f0 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
14500 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ll.#if !defined(
14510 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14520 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20  UTOMATIC_INDEX) 
14530 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  || SQLITE_DEFAUL
14540 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
14550 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X.              
14560 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f     | SQLITE_Auto
14570 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66  Index.#endif.#if
14580 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14590 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20  FILE_FORMAT<4.  
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
145b0 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
145c0 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66  leFmt.#endif.#if
145d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
145e0 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
145f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14600 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45    | SQLITE_LoadE
14610 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a  xtension.#endif.
14620 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
14630 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49  LT_RECURSIVE_TRI
14640 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20  GGERS.          
14650 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
14660 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64  RecTriggers.#end
14670 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
14680 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
14690 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53  REIGN_KEYS) && S
146a0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
146b0 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20  REIGN_KEYS.     
146c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
146d0 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
146e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a  .#endif.      ;.
146f0 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
14700 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
14710 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14720 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
14730 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  LE.  sqlite3Hash
14740 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Init(&db->aModul
14750 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
14760 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74   Add the default
14770 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14780 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41  nce BINARY. BINA
14790 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74  RY works for bot
147a0 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64  h UTF-8.  ** and
147b0 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20   UTF-16, so add 
147c0 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61  a version for ea
147d0 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20  ch to avoid any 
147e0 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a  unnecessary.  **
147f0 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68   conversions. Th
14800 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61  e only error tha
14810 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65  t can occur here
14820 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   is a malloc() f
14830 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63  ailure..  */.  c
14840 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
14850 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
14860 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e  ITE_UTF8, 0, bin
14870 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
14880 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
14890 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
148a0 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c  LITE_UTF16BE, 0,
148b0 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
148c0 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
148d0 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
148e0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
148f0 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
14900 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
14910 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52  llation(db, "RTR
14920 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  IM", SQLITE_UTF8
14930 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43  , (void*)1, binC
14940 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69  ollFunc, 0);.  i
14950 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
14960 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
14970 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
14980 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
14990 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
149a0 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
149b0 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20  UTF8, "BINARY", 
149c0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
149d0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29  ->pDfltColl!=0 )
149e0 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64  ;..  /* Also add
149f0 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e   a UTF-8 case-in
14a00 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74  sensitive collat
14a10 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f  ion sequence. */
14a20 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
14a30 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c  on(db, "NOCASE",
14a40 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
14a50 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
14a60 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  Func, 0);..  /* 
14a70 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61  Parse the filena
14a80 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e  me/URI argument.
14a90 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
14aa0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
14ab0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  c = sqlite3Parse
14ac0 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e  Uri(zVfs, zFilen
14ad0 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62  ame, &flags, &db
14ae0 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20  ->pVfs, &zOpen, 
14af0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
14b00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14b10 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
14b20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d  LITE_NOMEM ) db-
14b30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
14b40 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  1;.    sqlite3Er
14b50 72 6f 72 28 64 62 2c 20 72 63 2c 20 7a 45 72 72  ror(db, rc, zErr
14b60 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
14b70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
14b80 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
14b90 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  sg);.    goto op
14ba0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
14bb0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63   /* Open the bac
14bc0 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72  kend database dr
14bd0 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73  iver */.  rc = s
14be0 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
14bf0 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c  db->pVfs, zOpen,
14c00 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d   db, &db->aDb[0]
14c10 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  .pBt, 0,.       
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
14c40 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20  OPEN_MAIN_DB);. 
14c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14c60 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
14c70 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
14c80 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
14c90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
14ca0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14cb0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
14cc0 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  0);.    goto ope
14cd0 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
14ce0 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
14cf0 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
14d00 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
14d10 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
14d20 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
14d30 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
14d40 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a  t(db, 0);...  /*
14d50 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66   The default saf
14d60 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety_level for th
14d70 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
14d80 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74  is 'full'; for t
14d90 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
14da0 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e  abase it is 'NON
14db0 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  E'. This matches
14dc0 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
14dd0 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a   defaults.  .  *
14de0 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a  /.  db->aDb[0].z
14df0 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
14e00 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
14e10 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20  ty_level = 3;.  
14e20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65  db->aDb[1].zName
14e30 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
14e40 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
14e50 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d  evel = 1;..  db-
14e60 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
14e70 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
14e80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14e90 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
14ea0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
14eb0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
14ec0 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
14ed0 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
14ee0 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
14ef0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
14f00 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
14f10 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
14f20 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
14f30 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
14f40 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
14f50 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
14f60 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
14f70 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
14f80 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
14f90 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
14fa0 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
14fb0 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
14fc0 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
14fd0 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
14fe0 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
14ff0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
15000 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
15010 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
15020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
15030 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28  rcode(db);.  if(
15040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15050 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  {.    sqlite3Aut
15060 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28  oLoadExtensions(
15070 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  db);.    rc = sq
15080 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
15090 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
150a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
150b0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
150c0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  t;.    }.  }..#i
150d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
150e0 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64  LE_FTS1.  if( !d
150f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15100 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
15110 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  t sqlite3Fts1Ini
15120 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
15130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
15140 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  1Init(db);.  }.#
15150 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
15160 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32  LITE_ENABLE_FTS2
15170 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
15180 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
15190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
151a0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
151b0 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69  te3Fts2Init(sqli
151c0 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
151d0 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
151e0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
151f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15200 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28  NABLE_FTS3.  if(
15210 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
15220 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
15230 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15240 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
15250 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
15260 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15270 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20  NABLE_ICU.  if( 
15280 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
15290 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
152a0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
152b0 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
152c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
152d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
152e0 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
152f0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
15300 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
15310 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
15320 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
15330 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
15340 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
15350 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
15360 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
15370 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
15380 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
15390 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
153a0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
153b0 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
153c0 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
153d0 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
153e0 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
153f0 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
15400 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
15410 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
15420 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15430 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
15440 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
15450 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
15460 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
15470 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
15480 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
15490 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
154a0 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
154d0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
154e0 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  E);.#endif..  if
154f0 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72  ( rc ) sqlite3Er
15500 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
15510 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65  .  /* Enable the
15520 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f   lookaside-mallo
15530 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20  c subsystem */. 
15540 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
15550 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c  db, 0, sqlite3Gl
15560 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
15570 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20  kaside,.        
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
155a0 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b  fig.nLookaside);
155b0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ..  sqlite3_wal_
155c0 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
155d0 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  b, SQLITE_DEFAUL
155e0 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  T_WAL_AUTOCHECKP
155f0 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f  OINT);..opendb_o
15600 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
15610 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28  ee(zOpen);.  if(
15620 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72   db ){.    asser
15630 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20  t( db->mutex!=0 
15640 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d  || isThreadsafe=
15650 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  =0 || sqlite3Glo
15660 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
15670 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
15680 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15690 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
156a0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
156b0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
156c0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c   assert( db!=0 |
156d0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
156e0 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  EM );.  if( rc==
156f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
15700 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
15710 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
15720 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
15730 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15740 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
15750 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
15760 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d  K;.  }.  *ppDb =
15770 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   db;.#ifdef SQLI
15780 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
15790 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
157a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
157b0 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  og ){.    /* Ope
157c0 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65  ning a db handle
157d0 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
157e0 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20  er is passed 0. 
157f0 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72  */.    void *pAr
15800 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  g = sqlite3Globa
15810 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
15820 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  rg;.    sqlite3G
15830 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
15840 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46  log(pArg, db, zF
15850 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ilename, 0);.  }
15860 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
15870 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
15880 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  0, rc);.}../*.**
15890 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
158a0 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
158b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
158c0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
158d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
158e0 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
158f0 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
15900 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
15910 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
15930 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
15940 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
15950 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
15960 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
15970 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
15980 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
15990 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
159a0 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
159b0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
159c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
159d0 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
159e0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
159f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
15a00 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
15a10 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
15a20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15a30 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
15a40 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
15a50 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
15a60 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
15a70 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
15a80 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
15a90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15aa0 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
15ab0 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
15ac0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
15ad0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
15ae0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
15af0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
15b00 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
15b10 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
15b20 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
15b30 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
15b40 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
15b50 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
15b60 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
15b70 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
15b80 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
15b90 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
15ba0 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20  ppDb );.  *ppDb 
15bb0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
15bc0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
15bd0 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
15be0 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
15bf0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15c00 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56   rc;.#endif.  pV
15c10 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
15c20 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
15c30 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
15c40 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
15c50 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
15c60 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
15c70 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
15c80 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
15c90 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
15ca0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
15cb0 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
15cc0 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
15cd0 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
15ce0 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
15d00 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
15d10 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
15d20 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
15d30 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
15d40 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
15d50 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
15d60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
15d70 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
15d80 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
15d90 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
15da0 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53    ENC(*ppDb) = S
15db0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
15dc0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
15dd0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15de0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
15df0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
15e00 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
15e10 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
15e20 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
15e30 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
15e40 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
15e50 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
15e60 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
15e70 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
15e80 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
15e90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
15ea0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
15eb0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
15ec0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
15ed0 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
15ee0 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
15ef0 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
15f00 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
15f10 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
15f20 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
15f30 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
15f40 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
15f50 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
15f60 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
15f70 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
15f80 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
15f90 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
15fa0 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
15fb0 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
15fc0 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
15fd0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
15fe0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
15ff0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
16000 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  c;.}../*.** Regi
16010 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
16020 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
16030 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
16040 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
16050 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
16060 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
16070 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
16080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
16090 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
160a0 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
160b0 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
160c0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
160d0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
160e0 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
160f0 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
16100 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
16110 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16120 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
16130 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
16140 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
16150 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
16160 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
16170 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
16180 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
16190 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
161a0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
161b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
161c0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
161d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
161e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
161f0 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
16200 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
16210 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
16220 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
16230 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
16240 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
16250 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
16260 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
16270 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
16280 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20  ame,.  int enc, 
16290 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
162a0 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
162b0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
162c0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
162d0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
162e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
162f0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a    char *zName8;.
16300 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16310 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
16320 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
16330 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
16340 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69  .  zName8 = sqli
16350 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
16360 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
16370 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
16380 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a    if( zName8 ){.
16390 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43      rc = createC
163a0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
163b0 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  me8, (u8)enc, pC
163c0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
163d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
163e0 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b  ree(db, zName8);
163f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
16400 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
16410 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
16420 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
16430 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
16440 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
16450 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
16460 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
16470 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
16480 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
16490 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
164a0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
164b0 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
164c0 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
164d0 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
164e0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
164f0 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
16500 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
16510 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65  needed(.  sqlite
16520 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
16530 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
16540 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
16550 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69  eded)(void*,sqli
16560 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
16570 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  p,const char*).)
16580 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
16590 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
165a0 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
165b0 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65  eeded = xCollNee
165c0 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ded;.  db->xColl
165d0 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20  Needed16 = 0;.  
165e0 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
165f0 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
16600 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
16610 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
16620 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
16630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
16640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16650 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
16660 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
16670 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
16680 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
16690 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
166a0 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
166b0 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
166c0 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
166d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
166e0 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
166f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
16700 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73  on_needed16(.  s
16710 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
16720 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
16730 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
16740 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69  ollNeeded16)(voi
16750 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
16760 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76  eTextRep,const v
16770 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74  oid*).){.  sqlit
16780 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
16790 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
167a0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30  >xCollNeeded = 0
167b0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
167c0 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65  ded16 = xCollNee
167d0 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f  ded16;.  db->pCo
167e0 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
167f0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
16800 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
16810 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
16820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16830 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
16840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
16850 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
16860 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
16870 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
16880 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
16890 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20  an anachronism. 
168a0 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73  It used to be us
168b0 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ed to recover fr
168c0 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  om a.** malloc()
168d0 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51   failure, but SQ
168e0 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68  Lite now does th
168f0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
16900 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16910 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
16920 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
16930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16940 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  dif../*.** Test 
16950 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
16960 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  r not the databa
16970 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
16980 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a   in autocommit.*
16990 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  * mode.  Return 
169a0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e  TRUE if it is an
169b0 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20  d FALSE if not. 
169c0 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   Autocommit mode
169d0 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66   is on.** by def
169e0 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69  ault.  Autocommi
169f0 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79  t is disabled by
16a00 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
16a10 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64  nt and reenabled
16a20 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20  .** by the next 
16a30 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
16a40 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
16a50 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
16a60 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
16a70 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
16a80 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
16a90 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
16aa0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
16ab0 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
16ac0 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
16ad0 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
16ae0 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
16af0 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
16b00 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62  IOERR and possib
16b10 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
16b20 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
16b30 65 79 20 73 65 72 76 65 72 20 74 77 6f 20 70 75  ey server two pu
16b40 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
16b50 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
16b60 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
16b70 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
16b80 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
16b90 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
16ba0 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
16bb0 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
16bc0 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
16bd0 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
16be0 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
16bf0 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
16c00 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
16c10 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
16c20 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
16c30 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
16c40 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
16c50 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
16c60 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
16c70 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
16c80 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
16c90 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
16ca0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
16cb0 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
16cc0 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
16cd0 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
16ce0 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
16d00 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
16d10 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
16d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
16d30 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
16d40 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
16d50 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
16d60 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
16d70 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
16d80 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
16d90 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
16da0 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
16db0 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
16dc0 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
16dd0 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
16de0 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
16df0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
16e00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16e10 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
16e20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
16e30 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
16e40 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
16e50 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16e60 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
16e70 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
16e80 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
16e90 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
16ea0 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
16eb0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
16ec0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
16ed0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
16ee0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
16ef0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16f00 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
16f10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16f20 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
16f30 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
16f40 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
16f50 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
16f60 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
16f70 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
16f80 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
16f90 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
16fa0 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
16fb0 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
16fc0 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
16fd0 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
16fe0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
16ff0 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
17000 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
17010 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
17020 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
17030 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
17040 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
17050 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
17060 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
17070 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
17080 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
17090 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
170a0 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
170b0 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
170c0 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
170d0 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
170e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
170f0 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
17100 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74  TADATA.int sqlit
17110 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
17120 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
17130 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
17140 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
17150 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
17160 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
17170 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
17180 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
17190 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
171a0 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
171b0 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
171c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
171d0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
171e0 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
171f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
17200 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
17210 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
17220 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
17230 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
17240 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
17250 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
17260 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
17270 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
17280 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
17290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
172a0 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
172b0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
172c0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
172d0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
172e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
172f0 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
17300 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
17310 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17330 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
17340 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
17350 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
17360 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
17370 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
17380 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
17390 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
173a0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
173b0 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  l;..  char const
173c0 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
173d0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
173e0 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
173f0 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
17400 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
17410 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
17420 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45  inc = 0;..  /* E
17430 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
17440 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
17450 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
17460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
17470 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
17480 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17490 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
174a0 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
174b0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
174c0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
174d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
174e0 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
174f0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
17500 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
17510 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
17520 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
17530 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
17540 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
17550 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
17560 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
17570 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
17580 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
17590 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
175a0 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
175b0 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
175c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
175d0 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
175e0 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
175f0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
17600 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
17610 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
17620 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
17630 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
17640 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
17650 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
17660 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
17670 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
17680 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
17690 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
176a0 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
176b0 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
176c0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
176d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
176e0 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
176f0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
17700 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
17710 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
17720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17730 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17740 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
17750 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
17760 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
17770 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
17780 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
17790 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
177a0 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
177b0 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
177c0 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
177d0 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
177e0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
177f0 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
17800 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
17810 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
17820 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
17830 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
17840 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
17850 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
17860 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
17870 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
17880 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
17890 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
178a0 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
178b0 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
178c0 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
178d0 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
178e0 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
178f0 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
17900 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
17910 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
17920 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
17930 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
17940 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
17950 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
17960 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
17970 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
17980 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
17990 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
179a0 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  = (pCol->colFlag
179b0 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
179c0 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74  KEY)!=0;.    aut
179d0 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
179e0 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
179f0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
17a00 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
17a10 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
17a20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
17a30 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
17a40 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
17a50 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
17a60 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
17a70 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
17a80 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
17a90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
17aa0 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
17ab0 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
17ac0 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
17ad0 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
17ae0 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
17af0 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
17b00 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
17b10 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
17b20 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
17b30 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
17b40 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
17b50 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
17b60 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
17b70 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
17b80 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
17b90 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
17ba0 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
17bb0 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
17bc0 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
17bd0 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
17be0 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
17bf0 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
17c00 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
17c10 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
17c20 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
17c30 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
17c40 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
17c50 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
17c60 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
17c70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
17c80 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
17c90 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
17ca0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
17cb0 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
17cc0 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
17cd0 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
17ce0 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
17cf0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
17d00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
17d10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
17d20 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
17d30 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
17d40 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
17d50 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
17d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
17d70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
17d80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
17d90 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
17da0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17db0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c  #endif../*.** Sl
17dc0 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
17dd0 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
17de0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
17df0 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74  me slept..*/.int
17e00 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69   sqlite3_sleep(i
17e10 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65  nt ms){.  sqlite
17e20 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69  3_vfs *pVfs;.  i
17e30 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20  nt rc;.  pVfs = 
17e40 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
17e50 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d  (0);.  if( pVfs=
17e60 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
17e70 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
17e80 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c  on works in mill
17e90 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68  iseconds, but th
17ea0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53  e underlying OsS
17eb0 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49  leep() .  ** API
17ec0 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e   uses microsecon
17ed0 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30  ds. Hence the 10
17ee0 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  00's..  */.  rc 
17ef0 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  = (sqlite3OsSlee
17f00 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29  p(pVfs, 1000*ms)
17f10 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  /1000);.  return
17f20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
17f30 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
17f40 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73  the extended res
17f50 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e  ult codes..*/.in
17f60 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
17f70 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
17f80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
17f90 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74   onoff){.  sqlit
17fa0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
17fb0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
17fc0 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66  >errMask = onoff
17fd0 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
17fe0 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  0xff;.  sqlite3_
17ff0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
18000 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
18010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18020 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
18030 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74  xFileControl met
18040 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75  hod on a particu
18050 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  lar database..*/
18060 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c  .int sqlite3_fil
18070 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  e_control(sqlite
18080 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
18090 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20  r *zDbName, int 
180a0 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
180b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
180c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65  TE_ERROR;.  Btre
180d0 65 20 2a 70 42 74 72 65 65 3b 0a 0a 20 20 73 71  e *pBtree;..  sq
180e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
180f0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
18100 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33  pBtree = sqlite3
18110 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
18120 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
18130 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
18140 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
18150 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
18160 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *fd;.    sqlite3
18170 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
18180 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  e);.    pPager =
18190 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
181a0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
181b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
181c0 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71  0 );.    fd = sq
181d0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
181e0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
181f0 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20  rt( fd!=0 );.   
18200 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
18210 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
18220 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71  ER ){.      *(sq
18230 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72  lite3_file**)pAr
18240 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63  g = fd;.      rc
18250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18260 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e    }else if( fd->
18270 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
18280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18290 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
182a0 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  op, pArg);.    }
182b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
182c0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
182d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
182e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
182f0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tree);.  }.  sql
18300 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
18310 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
18320 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a  eturn rc;   .}..
18330 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  /*.** Interface 
18340 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c  to the testing l
18350 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ogic..*/.int sql
18360 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
18370 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  l(int op, ...){.
18380 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
18390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
183a0 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20  T_BUILTIN_TEST. 
183b0 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
183c0 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
183d0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
183e0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
183f0 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
18400 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
18410 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  NG..    */.    c
18420 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
18430 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b  TRL_PRNG_SAVE: {
18440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
18450 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20  ngSaveState();. 
18460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18470 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
18480 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61   Restore the sta
18490 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74  te of the PRNG t
184a0 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65  o the last state
184b0 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20   saved using.   
184c0 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20   ** PRNG_SAVE.  
184d0 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73  If PRNG_SAVE has
184e0 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
184f0 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a  en called, then.
18500 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62      ** this verb
18510 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f   acts like PRNG_
18520 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20  RESET..    */.  
18530 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
18540 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
18550 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ORE: {.      sql
18560 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53  ite3PrngRestoreS
18570 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
18580 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
18590 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20  /*.    ** Reset 
185a0 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f  the PRNG back to
185b0 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a   its uninitializ
185c0 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e  ed state.  The n
185d0 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ext call.    ** 
185e0 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  to sqlite3_rando
185f0 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73  mness() will res
18600 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69  eed the PRNG usi
18610 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c  ng a single call
18620 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  .    ** to the x
18630 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f  Randomness metho
18640 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  d of the default
18650 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   VFS..    */.   
18660 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
18670 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
18680 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
18690 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30  3_randomness(0,0
186a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
186b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
186c0 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
186d0 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45  st_control(BITVE
186e0 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72  C_TEST, size, pr
186f0 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20  ogram).    **.  
18700 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20    ** Run a test 
18710 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63  against a Bitvec
18720 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e   object of size.
18730 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72    The program ar
18740 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73  gument.    ** is
18750 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
18760 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e  egers that defin
18770 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65  es the test.  Re
18780 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20  turn -1 on a.   
18790 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
187a0 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f  ation error, 0 o
187b0 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f  n success, or no
187c0 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72  n-zero for an er
187d0 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  ror..    ** See 
187e0 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65  the sqlite3Bitve
187f0 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66  cBuiltinTest() f
18800 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
18810 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
18820 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
18830 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
18840 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20  C_TEST: {.      
18850 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
18860 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
18870 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f  int *aProg = va_
18880 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
18890 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
188a0 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
188b0 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20  st(sz, aProg);. 
188c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
188d0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
188e0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
188f0 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41  ontrol(BENIGN_MA
18900 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67  LLOC_HOOKS, xBeg
18910 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a  in, xEnd).    **
18920 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72  .    ** Register
18930 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74   hooks to call t
18940 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  o indicate which
18950 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
18960 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62  es .    ** are b
18970 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  enign..    */.  
18980 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
18990 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
189a0 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20  LLOC_HOOKS: {.  
189b0 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
189c0 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e   (*void_function
189d0 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76  )(void);.      v
189e0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
189f0 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20  nignBegin;.     
18a00 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
18a10 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20  BenignEnd;.     
18a20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20   xBenignBegin = 
18a30 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
18a40 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
18a50 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61   xBenignEnd = va
18a60 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
18a70 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  nction);.      s
18a80 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c  qlite3BenignMall
18a90 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42  ocHooks(xBenignB
18aa0 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64  egin, xBenignEnd
18ab0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18ac0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
18ad0 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
18ae0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
18af0 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
18b00 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65  NG_BYTE, unsigne
18b10 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  d int X).    **.
18b20 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50      ** Set the P
18b30 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74  ENDING byte to t
18b40 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
18b50 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30  argument, if X>0
18b60 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f  ..    ** Make no
18b70 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30   changes if X==0
18b80 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  .  Return the va
18b90 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69  lue of the pendi
18ba0 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61  ng byte.    ** a
18bb0 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65  s it existing be
18bc0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
18bd0 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  e was called..  
18be0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f    **.    ** IMPO
18bf0 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67  RTANT:  Changing
18c00 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
18c10 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30  e from 0x4000000
18c20 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20  0 results in.   
18c30 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   ** an incompati
18c40 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ble database fil
18c50 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67  e format.  Chang
18c60 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
18c70 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  byte.    ** whil
18c80 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63  e any database c
18c90 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
18ca0 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64  n results in und
18cb0 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a  efined and.    *
18cc0 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65  * dileterious be
18cd0 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  havior..    */. 
18ce0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
18cf0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
18d00 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63  BYTE: {.      rc
18d10 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
18d20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18d30 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b  OMIT_WSD.      {
18d40 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
18d50 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76  d int newVal = v
18d60 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
18d70 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ed int);.       
18d80 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71   if( newVal ) sq
18d90 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65  lite3PendingByte
18da0 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20   = newVal;.     
18db0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
18dc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
18dd0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
18de0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
18df0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
18e00 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29  L_ASSERT, int X)
18e10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18e20 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
18e30 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
18e40 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
18e50 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a  er or not.    **
18e60 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e   assert() was en
18e70 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
18e80 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20  -time.  If X is 
18e90 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28  true and assert(
18ea0 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62  ).    ** is enab
18eb0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
18ec0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72  turn value is tr
18ed0 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  ue.  If X is tru
18ee0 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73  e and.    ** ass
18ef0 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
18f00 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
18f10 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
18f20 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a  .  If X is.    *
18f30 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  * false and asse
18f40 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c  rt() is enabled,
18f50 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74   then the assert
18f60 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68  ion fires and th
18f70 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
18f80 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69   aborts.  If X i
18f90 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  s false and asse
18fa0 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
18fb0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
18fc0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
18fd0 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  s zero..    */. 
18fe0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
18ff0 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20  ESTCTRL_ASSERT: 
19000 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65  {.      volatile
19010 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20   int x = 0;.    
19020 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20 76    assert( (x = v
19030 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d  a_arg(ap,int))!=
19040 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
19050 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
19060 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20      }...    /*. 
19070 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
19080 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
19090 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
190a0 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  YS, int X).    *
190b0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
190c0 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
190d0 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
190e0 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57   see how the ALW
190f0 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e  AYS and.    ** N
19100 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65  EVER macros were
19110 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70   defined at comp
19120 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a  ile-time..    **
19130 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75  .    ** The retu
19140 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41  rn value is ALWA
19150 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a  YS(X).  .    **.
19160 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d      ** The recom
19170 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20 58  mended test is X
19180 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65 74  ==2.  If the ret
19190 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20  urn value is 2, 
191a0 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  that means.    *
191b0 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  * ALWAYS() and N
191c0 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68 20  EVER() are both 
191d0 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
191e0 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68  gh macros, which
191f0 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   is the.    ** d
19200 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20  efault setting. 
19210 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
19220 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20  alue is 1, then 
19230 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74 68  ALWAYS() is eith
19240 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63  er.    ** hard-c
19250 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20  oded to true or 
19260 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73 20  else it asserts 
19270 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  if its argument 
19280 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
19290 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61 76   The first behav
192a0 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20  ior (hard-coded 
192b0 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65 20  to true) is the 
192c0 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
192d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
192e0 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
192f0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
19300 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65  abled and the se
19310 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61  cond.    ** beha
19320 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66 20  vior (assert if 
19330 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
19340 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c 73  ALWAYS() is fals
19350 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
19360 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
19370 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
19380 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
19390 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  t() is enabled..
193a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
193b0 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  e run-time test 
193c0 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20  procedure might 
193d0 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c  look something l
193e0 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
193f0 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73  .    **    if( s
19400 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19410 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19420 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d  TRL_ALWAYS, 2)==
19430 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  2 ){.    **     
19440 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64   // ALWAYS() and
19450 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d   NEVER() are no-
19460 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
19470 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20  macros.    **   
19480 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
19490 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
194a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
194b0 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20  ASSERT, 1) ){.  
194c0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
194d0 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20 74  AYS(x) asserts t
194e0 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e  hat x is true. N
194f0 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73 20  EVER(x) asserts 
19500 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  x is false..    
19510 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  **    }else{.   
19520 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
19530 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  YS(x) is a const
19540 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29  ant 1.  NEVER(x)
19550 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30   is a constant 0
19560 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20  ..    **    }.  
19570 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
19580 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
19590 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WAYS: {.      in
195a0 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
195b0 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
195c0 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20   ALWAYS(x);.    
195d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
195e0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
195f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19600 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
19610 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b  CTRL_BYTEORDER);
19620 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19630 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
19640 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65 20  ned reveals the 
19650 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68  byte-order of th
19660 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68  e computer on wh
19670 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74  ich.    ** SQLit
19680 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20  e is running:.  
19690 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
196a0 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69    1     big-endi
196b0 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65  an,    determine
196c0 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20  d at run-time.  
196d0 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20    **      10    
196e0 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
196f0 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75  determined at ru
19700 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34  n-time.    **  4
19710 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e  32101     big-en
19720 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69  dian,    determi
19730 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
19740 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34  ime.    **  1234
19750 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e  10     little-en
19760 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64  dian, determined
19770 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
19780 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  .    */ .    cas
19790 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
197a0 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20  L_BYTEORDER: {. 
197b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
197c0 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b  _BYTEORDER*100 +
197d0 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e   SQLITE_LITTLEEN
197e0 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45  DIAN*10 + SQLITE
197f0 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20  _BIGENDIAN;.    
19800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
19810 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
19820 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
19830 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
19840 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a  SERVE, sqlite3 *
19850 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
19860 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
19870 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74   nReserve size t
19880 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  o N for the main
19890 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65   database on the
198a0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
198b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
198c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
198d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
198e0 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20  RESERVE: {.     
198f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
19900 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
19910 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
19920 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
19930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19940 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
19950 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
19960 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
19970 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  geSize(db->aDb[0
19980 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b  ].pBt, 0, x, 0);
19990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
199a0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
199b0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
199c0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
199d0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
199e0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
199f0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
19a00 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a  TIONS, sqlite3 *
19a10 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
19a20 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20  *.    ** Enable 
19a30 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f  or disable vario
19a40 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
19a50 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
19a60 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20  poses.  The .   
19a70 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69   ** argument N i
19a80 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f  s a bitmask of o
19a90 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20  ptimizations to 
19aa0 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f  be disabled.  Fo
19ab0 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20  r normal.    ** 
19ac0 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75  operation N shou
19ad0 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64  ld be 0.  The id
19ae0 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73  ea is that a tes
19af0 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20  t program (like 
19b00 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c  the.    ** SQL L
19b10 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54  ogic Test or SLT
19b20 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61   test module) ca
19b30 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53  n run the same S
19b40 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  QL multiple time
19b50 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61  s.    ** with va
19b60 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
19b70 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20  ons disabled to 
19b80 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
19b90 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20  same answer.    
19ba0 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ** is obtained i
19bb0 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20  n every case..  
19bc0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
19bd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
19be0 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20  TIMIZATIONS: {. 
19bf0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
19c00 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
19c10 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64  lite3*);.      d
19c20 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20  b->dbOptFlags = 
19c30 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c  (u16)(va_arg(ap,
19c40 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b   int) & 0xffff);
19c50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19c60 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
19c70 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
19c80 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
19c90 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
19ca0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
19cb0 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  RD, const char *
19cc0 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20  zWord).    **.  
19cd0 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73    ** If zWord is
19ce0 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67   a keyword recog
19cf0 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72  nized by the par
19d00 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ser, then return
19d10 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
19d20 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20  er of keywords. 
19d30 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20   Or if zWord is 
19d40 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72  not a keyword, r
19d50 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20  eturn 0..    ** 
19d60 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
19d70 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c  t feature is onl
19d80 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
19d90 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
19da0 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  since.    ** the
19db0 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
19dc0 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64  D macro is not d
19dd0 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
19de0 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20  ile if SQLite.  
19df0 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73    ** is built us
19e00 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75  ing separate sou
19e10 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  rce files..    *
19e20 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
19e30 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
19e40 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f  WORD: {.      co
19e50 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  nst char *zWord 
19e60 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
19e70 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
19e80 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
19e90 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b  Strlen30(zWord);
19ea0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c  .      rc = (sql
19eb0 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
19ec0 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d  (u8*)zWord, n)!=
19ed0 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f  TK_ID) ? SQLITE_
19ee0 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20  N_KEYWORD : 0;. 
19ef0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19f00 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f  }.#endif ..    /
19f10 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
19f20 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19f30 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
19f40 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c  LLOC, sz, &pNew,
19f50 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a   pFree);.    **.
19f60 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65      ** Pass pFre
19f70 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63  e into sqlite3Sc
19f80 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20  ratchFree(). .  
19f90 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65    ** If sz>0 the
19fa0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72  n allocate a scr
19fb0 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f  atch buffer into
19fc0 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a   pNew.  .    */.
19fd0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19fe0 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
19ff0 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
1a000 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70  void *pFree, **p
1a010 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20  pNew;.      int 
1a020 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76  sz;.      sz = v
1a030 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1a040 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61        ppNew = va
1a050 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29  _arg(ap, void**)
1a060 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20  ;.      pFree = 
1a070 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
1a080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20  );.      if( sz 
1a090 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74  ) *ppNew = sqlit
1a0a0 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
1a0b0 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sz);.      sqlit
1a0c0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46  e3ScratchFree(pF
1a0d0 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ree);.      brea
1a0e0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1a0f0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1a100 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1a110 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
1a120 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f  E_FAULT, int ono
1a130 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ff);.    **.    
1a140 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
1a150 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72  onoff is non-zer
1a160 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65  o, configure the
1a170 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68 61   wrappers so tha
1a180 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62  t all.    ** sub
1a190 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1a1a0 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64   localtime() and
1a1b0 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20   variants fail. 
1a1c0 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f  If onoff is zero
1a1d0 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68  ,.    ** undo th
1a1e0 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20  is setting..    
1a1f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1a200 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
1a210 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20  LTIME_FAULT: {. 
1a220 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1a230 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74  alConfig.bLocalt
1a240 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72  imeFault = va_ar
1a250 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1a260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1a270 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1a280 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
1a290 58 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20  XPLAIN).    /*  
1a2a0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1a2b0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1a2c0 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54  TCTRL_EXPLAIN_ST
1a2d0 4d 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  MT,.    **      
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c    sqlite3_stmt*,
1a300 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20  const char**);. 
1a310 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1a320 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
1a330 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
1a340 5f 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73  _EXPLAIN, each s
1a350 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64  qlite3_stmt hold
1a360 73 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e  s.    ** a strin
1a370 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
1a380 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70   the optimized p
1a390 61 72 73 65 20 74 72 65 65 2e 20 20 54 68 69 73  arse tree.  This
1a3a0 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20   test-control.  
1a3b0 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
1a3c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73  ointer to that s
1a3d0 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  tring..    */.  
1a3e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1a3f0 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53  STCTRL_EXPLAIN_S
1a400 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TMT: {.      sql
1a410 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1a420 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
1a430 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20  lite3_stmt*);.  
1a440 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1a450 2a 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28  *pzRet = va_arg(
1a460 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a  ap, const char**
1a470 29 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20  );.      *pzRet 
1a480 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
1a490 6c 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29  lanation((Vdbe*)
1a4a0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72  pStmt);.      br
1a4b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1a4c0 66 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  f..    /*   sqli
1a4d0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1a4e0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1a4f0 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20  _NEVER_CORRUPT, 
1a500 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  int);.    **.   
1a510 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72   ** Set or clear
1a520 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64   a flag that ind
1a530 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1a540 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1a550 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20   always well-.  
1a560 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20    ** formed and 
1a570 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20  never corrupt.  
1a580 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65  This flag is cle
1a590 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69  ar by default, i
1a5a0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20  ndicating that. 
1a5b0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1a5c0 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65 20  iles might have 
1a5d0 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75 70  arbitrary corrup
1a5e0 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74  tion.  Setting t
1a5f0 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20  he flag during. 
1a600 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61     ** testing ca
1a610 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73 73  uses certain ass
1a620 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1a630 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20   in the code to 
1a640 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20 20  be activated.   
1a650 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74   ** that demonst
1a660 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f  rat invariants o
1a670 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  n well-formed da
1a680 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20  tabase files..  
1a690 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1a6a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
1a6b0 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20  VER_CORRUPT: {. 
1a6c0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1a6d0 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f  alConfig.neverCo
1a6e0 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61  rrupt = va_arg(a
1a6f0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1a700 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
1a710 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1a720 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1a730 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45  TE_TESTCTRL_VDBE
1a740 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c  _COVERAGE, xCall
1a750 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20  back, ptr);.    
1a760 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1a770 65 20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20  e VDBE coverage 
1a780 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
1a790 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77  n to xCallback w
1a7a0 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20  ith context .   
1a7b0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e   ** pointer ptr.
1a7c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1a7d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1a7e0 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20  _VDBE_COVERAGE: 
1a7f0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1a800 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
1a810 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
1a820 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61   (*branch_callba
1a830 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38  ck)(void*,int,u8
1a840 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ,u8);.      sqli
1a850 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1a860 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61  xVdbeBranch = va
1a870 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63  _arg(ap,branch_c
1a880 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
1a890 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1a8a0 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41  fig.pVdbeBranchA
1a8b0 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76  rg = va_arg(ap,v
1a8c0 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20  oid*);.#endif.  
1a8d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a8e0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1a8f0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1a900 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a910 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c  SORTER_MMAP, db,
1a920 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63   nMax); */.    c
1a930 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1a940 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a  TRL_SORTER_MMAP:
1a950 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1a960 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1a970 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1a980 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65     db->nMaxSorte
1a990 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61  rMmap = va_arg(a
1a9a0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1a9b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  reak;.    }..  }
1a9c0 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1a9d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a9e0 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
1a9f0 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
1aa00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1aa10 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
1aa20 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
1aa30 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1aa40 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
1aa50 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
1aa60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
1aa70 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
1aa80 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
1aa90 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
1aaa0 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
1aab0 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
1aac0 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
1aad0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
1aae0 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
1aaf0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
1ab00 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
1ab10 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
1ab20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
1ab30 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
1ab40 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
1ab50 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
1ab60 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
1ab70 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
1ab80 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
1ab90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1aba0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
1abb0 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
1abc0 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
1abd0 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
1abe0 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
1abf0 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
1ac00 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1ac10 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
1ac20 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1ac30 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
1ac40 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
1ac50 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1ac60 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1ac70 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
1ac80 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
1ac90 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d  ;.  zFilename +=
1aca0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1acb0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
1acc0 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e  .  while( zFilen
1acd0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
1ace0 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69  t x = strcmp(zFi
1acf0 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1ad00 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
1ad10 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1ad20 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1ad30 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29  ;.    if( x==0 )
1ad40 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
1ad50 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  e;.    zFilename
1ad60 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
1ad70 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
1ad80 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1ad90 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
1ada0 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  urn a boolean va
1adb0 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
1adc0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e  parameter..*/.in
1add0 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  t sqlite3_uri_bo
1ade0 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72  olean(const char
1adf0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
1ae00 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
1ae10 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63   int bDflt){.  c
1ae20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1ae30 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1ae40 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
1ae50 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74  zParam);.  bDflt
1ae60 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72   = bDflt!=0;.  r
1ae70 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65  eturn z ? sqlite
1ae80 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62  3GetBoolean(z, b
1ae90 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d  Dflt) : bDflt;.}
1aea0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1aeb0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
1aec0 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
1aed0 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
1aee0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1aef0 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28  lite3_uri_int64(
1af00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1af10 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
1af20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73  Filename as pass
1af30 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20  ed to xOpen */. 
1af40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1af50 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52  ram,       /* UR
1af60 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67  I parameter soug
1af70 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ht */.  sqlite3_
1af80 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20 20  int64 bDflt     
1af90 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70    /* return if p
1afa0 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73  arameter is miss
1afb0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ing */.){.  cons
1afc0 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1afd0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1afe0 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
1aff0 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ram);.  sqlite3_
1b000 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a  int64 v;.  if( z
1b010 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f 69 36   && sqlite3Atoi6
1b020 34 28 7a 2c 20 26 76 2c 20 73 71 6c 69 74 65 33  4(z, &v, sqlite3
1b030 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
1b040 49 54 45 5f 55 54 46 38 29 3d 3d 53 51 4c 49 54  ITE_UTF8)==SQLIT
1b050 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c  E_OK ){.    bDfl
1b060 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
1b070 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  urn bDflt;.}../*
1b080 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42  .** Return the B
1b090 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65  tree pointer ide
1b0a0 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61  ntified by zDbNa
1b0b0 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  me.  Return NULL
1b0c0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1b0d0 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33  /.Btree *sqlite3
1b0e0 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71  DbNameToBtree(sq
1b0f0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1b100 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1b110 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1b120 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1b130 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
1b140 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20  ->aDb[i].pBt.   
1b150 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30    && (zDbName==0
1b160 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
1b170 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e  mp(zDbName, db->
1b180 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  aDb[i].zName)==0
1b190 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1b1a0 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d  eturn db->aDb[i]
1b1b0 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  .pBt;.    }.  }.
1b1c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1b1d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b1e0 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
1b1f0 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
1b200 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1b210 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
1b220 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
1b230 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
1b240 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
1b250 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1b260 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1b270 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44   *pBt = sqlite3D
1b280 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1b290 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
1b2a0 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
1b2b0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
1b2c0 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
1b2d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1b2e0 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
1b2f0 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
1b300 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
1b310 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
1b320 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
1b330 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
1b340 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
1b350 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1b360 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1b370 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  ){.  Btree *pBt 
1b380 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1b390 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1b3a0 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
1b3b0 74 20 3f 20 73 71 6c 69 74 65 33 50 61 67 65 72  t ? sqlite3Pager
1b3c0 49 73 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  Isreadonly(sqlit
1b3d0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
1b3e0 29 29 20 3a 20 2d 31 3b 0a 7d 0a                 )) : -1;.}.