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

Artifact deaeda63657d005ad9833f2191b7ff65c83e0ded:


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 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
44e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
44f0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
4500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
4510: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
4520: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4530: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
4540: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
4550: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
4560: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
4570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
4580: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
4590: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
45a0: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
45b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
45c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
45d0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
45e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
45f0: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
4600: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
4610: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
4620: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
4630: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
4640: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
4650: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
4660: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
4670: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4680: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4690: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
46a0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
46b0: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
46c0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
46d0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
46e0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
46f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
4700: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
4710: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
4720: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
4730: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
4740: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
4750: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4760: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4770: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
4780: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
4790: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
47a0: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
47b0: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
47c0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
47d0: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
47e0: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
47f0: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
4800: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
4810: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
4820: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4830: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
4840: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
4850: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4860: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
4870: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
4880: 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65  kaside slot afte
4890: 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65  r ROUNDDOWN8 nee
48a0: 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a  ds to be larger.
48b0: 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e    ** than a poin
48c0: 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c  ter to be useful
48d0: 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f  ..  */.  sz = RO
48e0: 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f  UNDDOWN8(sz);  /
48f0: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
4900: 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a  9382 */.  if( sz
4910: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  <=(int)sizeof(Lo
4920: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20  okasideSlot*) ) 
4930: 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e  sz = 0;.  if( cn
4940: 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20  t<0 ) cnt = 0;. 
4950: 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e   if( sz==0 || cn
4960: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  t==0 ){.    sz =
4970: 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
4980: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4990: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pBuf==0 ){.    s
49a0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
49b0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
49c0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
49d0: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
49e0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34    /* IMP: R-6194
49f0: 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73  9-35727 */.    s
4a00: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4a10: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
4a20: 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20   pStart ) cnt = 
4a30: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
4a40: 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20  e(pStart)/sz;.  
4a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72  }else{.    pStar
4a60: 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20  t = pBuf;.  }.  
4a70: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
4a80: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
4a90: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4aa0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
4ab0: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
4ac0: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
4ad0: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
4ae0: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
4af0: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
4b00: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
4b10: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
4b20: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
4b30: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
4b40: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
4b50: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
4b60: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
4b70: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
4b80: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
4b90: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4ba0: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
4bb0: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4bc0: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
4bd0: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
4be0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4bf0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
4c00: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
4c10: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
4c20: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4c30: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
4c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
4c50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4c60: 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  art = db;.    db
4c70: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4c80: 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c   = db;.    db->l
4c90: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4ca0: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
4cb0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4cc0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
4cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4cf0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
4d00: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
4d10: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4d20: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
4d30: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
4d40: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
4d50: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  {.  return db->m
4d60: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
4d70: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
4d80: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
4d90: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
4da0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
4db0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
4dc0: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
4dd0: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
4de0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4df0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4e00: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
4e10: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
4e20: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
4e30: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
4e40: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
4e50: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
4e60: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
4e70: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50  ( pBt ){.      P
4e80: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
4e90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4ea0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
4eb0: 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
4ec0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
4ed0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
4ee0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
4ef0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4f00: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
4f10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4f20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
4f30: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
4f40: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
4f50: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
4f60: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
4f70: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
4f80: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
4f90: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
4fa0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
4fb0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
4fc0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
4fd0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
4fe0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
4ff0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
5000: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
5010: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
5020: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
5030: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
5040: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
5050: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
5060: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
5070: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
5080: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
5090: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
50a0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
50b0: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
50c0: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
50d0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
50e0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
50f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5100: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5110: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5120: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
5130: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
5140: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
5150: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
5160: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
5170: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
5180: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
5190: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
51a0: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
51b0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
51c0: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
51d0: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
51e0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
51f0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
5200: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
5210: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
5220: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
5230: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
5240: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5250: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
5260: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
5270: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
5280: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
5290: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
52a0: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
52b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
52c0: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
52d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
52e0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
52f0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
5300: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
5310: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
5320: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
5330: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
5340: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
5350: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
5360: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
5370: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
5380: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
5390: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
53a0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
53b0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
53c0: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
53d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
53e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
53f0: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
5400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5410: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
5420: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
5430: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
5440: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5450: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
5460: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
5470: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
5480: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
5490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
54a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
54b0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
54c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
54d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
54e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
54f0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5500: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
5510: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
5520: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
5530: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
5540: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
5550: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
5560: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
5570: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
5580: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
5590: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
55a0: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
55b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
55c0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
55d0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
55e0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
55f0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
5600: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
5610: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
5620: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
5630: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
5640: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
5650: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
5660: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
5670: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
5680: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
5690: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
56a0: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
56b0: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
56c0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
56d0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
56e0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
56f0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
5700: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
5710: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
5720: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
5730: 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
5740: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
5750: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
5760: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
5770: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
5780: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
5790: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
57a0: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
57b0: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
57c0: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
57d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  {.      /* Leave
57e0: 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74   rc unchanged at
57f0: 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b   0 */.    }else{
5800: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
5810: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
5820: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
5840: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
5850: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
5860: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
5870: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
5880: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
5890: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
58a0: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
58b0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
58c0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
58d0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
58e0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
58f0: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
5900: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
5910: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
5920: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
5930: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
5940: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
5950: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
5960: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
5970: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
5980: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
5990: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
59a0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
59b0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
59c0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
59d0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
59e0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
59f0: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
5a00: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
5a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
5a20: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
5a30: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
5a40: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
5a50: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
5a60: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
5a70: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
5a80: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
5a90: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
5aa0: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
5ab0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
5ac0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
5ad0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
5ae0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
5af0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5b00: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
5b10: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
5b20: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
5b30: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5b40: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
5b50: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
5b60: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
5b70: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
5b80: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
5b90: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5ba0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
5bb0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
5bc0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5bd0: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
5be0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
5bf0: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
5c00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
5c10: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
5c20: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
5c30: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
5c40: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5c50: 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73  Close all open s
5c60: 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20  avepoints. This 
5c70: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61  function only ma
5c80: 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73  nipulates fields
5c90: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5ca0: 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ase handle objec
5cb0: 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  t, it does not c
5cc0: 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69  lose any savepoi
5cd0: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  nts that may be 
5ce0: 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62  open.** at the b
5cf0: 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65  -tree/pager leve
5d00: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
5d10: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
5d20: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5d30: 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
5d40: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53  vepoint ){.    S
5d50: 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d  avepoint *pTmp =
5d60: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
5d70: 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f  .    db->pSavepo
5d80: 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
5d90: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  t;.    sqlite3Db
5da0: 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
5db0: 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70    }.  db->nSavep
5dc0: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  oint = 0;.  db->
5dd0: 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
5de0: 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
5df0: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
5e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5e10: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
5e20: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69   function associ
5e30: 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65  ated with FuncDe
5e40: 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63  f p, if any. Exc
5e50: 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20  ept,.** if this 
5e60: 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
5e70: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63  copy of the func
5e80: 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76  tion, do not inv
5e90: 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65  oke it. Multiple
5ea0: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20  .** copies of a 
5eb0: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20  single function 
5ec0: 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e  are created when
5ed0: 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e   create_function
5ee0: 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  () is called.** 
5ef0: 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20  with SQLITE_ANY 
5f00: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e  as the encoding.
5f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f20: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
5f30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
5f40: 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63  cDef *p){.  Func
5f50: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
5f60: 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65  tructor = p->pDe
5f70: 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20  structor;.  if( 
5f80: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
5f90: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
5fa0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
5fb0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
5fc0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  f==0 ){.      pD
5fd0: 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74  estructor->xDest
5fe0: 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d  roy(pDestructor-
5ff0: 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20  >pUserData);.   
6000: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6010: 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72  (db, pDestructor
6020: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
6030: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
6040: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61   all sqlite3_vta
6050: 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62  b objects that b
6060: 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73  elong to databas
6070: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
6080: 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  db. This is call
6090: 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65  ed when db is be
60a0: 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  ing closed..*/.s
60b0: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f  tatic void disco
60c0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c  nnectAllVtab(sql
60d0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64  ite3 *db){.#ifnd
60e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
60f0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
6100: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t i;.  sqlite3Bt
6110: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6120: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6130: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6140: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
6150: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
6160: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64  chema;.    if( d
6170: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
6180: 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  a ){.      HashE
6190: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  lem *p;.      fo
61a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
61b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
61c0: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
61d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
61e0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
61f0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
6200: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
6210: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
6220: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
6230: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
6240: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
6250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6260: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
6270: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
6280: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
6290: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65  ARAMETER(db);.#e
62a0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
62b0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 64 61 74  turn TRUE if dat
62c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
62d0: 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69   db has unfinali
62e0: 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  zed prepared.** 
62f0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
6300: 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33  finished sqlite3
6310: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e  _backup objects.
6320: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
6330: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
6340: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
6350: 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72    int j;.  asser
6360: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6370: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
6380: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   );.  if( db->pV
6390: 64 62 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  dbe ) return 1;.
63a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
63b0: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
63c0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
63d0: 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[j].pBt;.   
63e0: 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69   if( pBt && sqli
63f0: 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b  te3BtreeIsInBack
6400: 75 70 28 70 42 74 29 20 29 20 72 65 74 75 72 6e  up(pBt) ) return
6410: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
6420: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
6430: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53  se an existing S
6440: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a  QLite database.*
6450: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
6460: 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65  ite3Close(sqlite
6470: 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65  3 *db, int force
6480: 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21  Zombie){.  if( !
6490: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
64a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
64b0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
64c0: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
64d0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
64e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
64f0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
6500: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6510: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  r(db->mutex);.. 
6520: 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f   /* Force xDisco
6530: 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61  nnect calls on a
6540: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
6550: 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63  s */.  disconnec
6560: 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20  tAllVtab(db);.. 
6570: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
6580: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
6590: 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  e disconnectAllV
65a0: 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  tab() call above
65b0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68  .  ** will not h
65c0: 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78  ave called the x
65d0: 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74  Disconnect() met
65e0: 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75  hod on any virtu
65f0: 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69  al.  ** tables i
6600: 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e  n the db->aVTran
6610: 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66  s[] array. The f
6620: 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
6630: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20  VtabRollback(). 
6640: 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f   ** call will do
6650: 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20   so. We need to 
6660: 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74  do this before t
6670: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74  he check for act
6680: 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ive.  ** SQL sta
6690: 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61  tements below, a
66a0: 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d  s the v-table im
66b0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
66c0: 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a   be storing.  **
66d0: 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73   some prepared s
66e0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e  tatements intern
66f0: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ally..  */.  sql
6700: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
6710: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61  (db);..  /* Lega
6720: 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c  cy behavior (sql
6730: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68  ite3_close() beh
6740: 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74  avior) is to ret
6750: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
6760: 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e  BUSY if the conn
6770: 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62  ection can not b
6780: 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61  e closed immedia
6790: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
67a0: 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26   !forceZombie &&
67b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
67c0: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
67d0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
67e0: 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62  LITE_BUSY, "unab
67f0: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
6800: 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22  to unfinalized "
6810: 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65  .       "stateme
6820: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
6830: 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20  d backups");.   
6840: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
6850: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
6860: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6870: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69  TE_BUSY;.  }..#i
6880: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6890: 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
68a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
68b0: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
68c0: 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68     /* Closing th
68d0: 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  e handle. Fourth
68e0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
68f0: 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32  ssed the value 2
6900: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
6910: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
6920: 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62  llog(sqlite3Glob
6930: 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
6940: 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a  Arg, db, 0, 2);.
6950: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6960: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e   Convert the con
6970: 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a  nection into a z
6980: 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63  ombie and then c
6990: 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  lose it..  */.  
69a0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
69b0: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b  TE_MAGIC_ZOMBIE;
69c0: 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  .  sqlite3LeaveM
69d0: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
69e0: 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ie(db);.  return
69f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6a00: 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69  *.** Two variati
6a10: 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69  ons on the publi
6a20: 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  c interface for 
6a30: 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61  closing a databa
6a40: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
6a50: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c  . The sqlite3_cl
6a60: 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65  ose() version re
6a70: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
6a80: 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20  Y and.** leaves 
6a90: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
6aa0: 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ption if there a
6ab0: 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  re unfinalized p
6ac0: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
6ad0: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6ae0: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
6af0: 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ups.  The sqlite
6b00: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20  3_close_v2().** 
6b10: 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74  version forces t
6b20: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
6b30: 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65   become a zombie
6b40: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
6b50: 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72   unclosed resour
6b60: 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65  ces, and arrange
6b70: 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69  s for deallocati
6b80: 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  on when the last
6b90: 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74  .** prepare stat
6ba0: 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33  ement or sqlite3
6bb0: 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a  _backup closes..
6bc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
6bd0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
6be0: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6bf0: 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a  3Close(db,0); }.
6c00: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
6c10: 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62  e_v2(sqlite3 *db
6c20: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6c30: 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a  3Close(db,1); }.
6c40: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
6c50: 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
6c60: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6c70: 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72  b..**.** Further
6c80: 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73  more, if databas
6c90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
6ca0: 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61  is a zombie (mea
6cb0: 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a  ning that there.
6cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  ** has been a pr
6cd0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
6ce0: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72  te3_close(db) or
6cf0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6d00: 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76  2(db)) and.** ev
6d10: 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ery sqlite3_stmt
6d20: 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69   has now been fi
6d30: 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72  nalized and ever
6d40: 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  y sqlite3_backup
6d50: 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64   has.** finished
6d60: 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20  , then free all 
6d70: 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f  resources..*/.vo
6d80: 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  id sqlite3LeaveM
6d90: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
6da0: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ie(sqlite3 *db){
6db0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20  .  HashElem *i; 
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dd0: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
6de0: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
6df0: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt j;..  /* If t
6e00: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
6e10: 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d  ding sqlite3_stm
6e20: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
6e30: 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a  kup objects.  **
6e40: 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65   or if the conne
6e50: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  ction has not ye
6e60: 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79  t been closed by
6e70: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6e80: 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a  2(),.  ** then j
6e90: 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75  ust leave the mu
6ea0: 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  tex and return..
6eb0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
6ec0: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
6ed0: 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e  IC_ZOMBIE || con
6ee0: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62  nectionIsBusy(db
6ef0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
6f00: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
6f10: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
6f20: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  urn;.  }..  /* I
6f30: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
6f40: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
6f50: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6f60: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
6f70: 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c  .  ** closed all
6f80: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e   sqlite3_stmt an
6f90: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
6fa0: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73   objects and has
6fb0: 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65   been.  ** passe
6fc0: 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d to sqlite3_clo
6fd0: 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  se (meaning that
6fe0: 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29   it is a zombie)
6ff0: 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20  .  Therefore,.  
7000: 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
7010: 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  free all resourc
7020: 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49  es..  */..  /* I
7030: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
7040: 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74  is open, roll it
7050: 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f   back. This also
7060: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66   ensures that if
7070: 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61  .  ** any databa
7080: 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20  se schemas have 
7090: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79  been modified by
70a0: 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20   an uncommitted 
70b0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
70c0: 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e   they are reset.
70d0: 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65   And that the re
70e0: 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75  quired b-tree mu
70f0: 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d  tex is held to m
7100: 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ake.  ** the pag
7110: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  er rollback and 
7120: 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20  schema reset an 
7130: 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e  atomic operation
7140: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f  . */.  sqlite3Ro
7150: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
7160: 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20  LITE_OK);..  /* 
7170: 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e  Free any outstan
7180: 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73  ding Savepoint s
7190: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20  tructures. */.  
71a0: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
71b0: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f  points(db);..  /
71c0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61  * Close all data
71d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
71e0: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
71f0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
7200: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
7210: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
7220: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
7230: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
7240: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
7250: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
7260: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
7270: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
7280: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
7290: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
72a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
72b0: 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73  Clear the TEMP s
72c0: 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79  chema separately
72d0: 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69   and last */.  i
72e0: 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  f( db->aDb[1].pS
72f0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c  chema ){.    sql
7300: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
7310: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
7320: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
7330: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
7340: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  (db);..  /* Free
7350: 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66   up the array of
7360: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
7370: 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ases */.  sqlite
7380: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
7390: 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73  eArray(db);.  as
73a0: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32  sert( db->nDb<=2
73b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
73c0: 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74  ->aDb==db->aDbSt
73d0: 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65  atic );..  /* Te
73e0: 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e  ll the code in n
73f0: 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65  otify.c that the
7400: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c   connection no l
7410: 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a  onger holds any.
7420: 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64    ** locks and d
7430: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
7440: 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f  any further unlo
7450: 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
7460: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  cks..  */.  sqli
7470: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f  te3ConnectionClo
7480: 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  sed(db);..  for(
7490: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
74a0: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
74b0: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
74c0: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
74d0: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
74e0: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
74f0: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
7500: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
7510: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
7520: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
7530: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
7540: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
7550: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
7560: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7570: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7580: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
7590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
75a0: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
75b0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
75c0: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
75d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
75e0: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
75f0: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
7600: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
7610: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
7620: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
7630: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
7640: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
7650: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
7660: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
7670: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
7680: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
7690: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
76a0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
76b0: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
76c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
76d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
76e0: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
76f0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
7700: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
7710: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7720: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7730: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
7740: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
7750: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
7760: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
7770: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
7780: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
7790: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
77a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
77b0: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
77c0: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
77d0: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
77e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
77f0: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
7800: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
7810: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
7820: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
7830: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
7840: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
7850: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
7860: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
7870: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
7880: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7890: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71  (db->pErr);.  sq
78a0: 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73  lite3CloseExtens
78b0: 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d  ions(db);..  db-
78c0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
78d0: 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20  MAGIC_ERROR;..  
78e0: 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61  /* The temp-data
78f0: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61  base schema is a
7900: 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65  llocated differe
7910: 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74  ntly from the ot
7920: 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20  her schema.  ** 
7930: 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73  objects (using s
7940: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69  qliteMalloc() di
7950: 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
7960: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  of sqlite3BtreeS
7970: 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53  chema())..  ** S
7980: 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
7990: 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64   freed here. Tod
79a0: 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20  o: Why not roll 
79b0: 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20  the temp schema 
79c0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61  into.  ** the sa
79d0: 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  me sqliteMalloc(
79e0: 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61  ) as the one tha
79f0: 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20  t allocates the 
7a00: 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73  database .  ** s
7a10: 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20  tructure?.  */. 
7a20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7a30: 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  b, db->aDb[1].pS
7a40: 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
7a50: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
7a60: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
7a70: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
7a80: 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73  AGIC_CLOSED;.  s
7a90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
7aa0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7ab0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
7ac0: 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b  aside.nOut==0 );
7ad0: 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20    /* Fails on a 
7ae0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
7af0: 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64   leak */.  if( d
7b00: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
7b10: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
7b20: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
7b30: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
7b40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
7b50: 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a  free(db);.}../*.
7b60: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
7b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
7b80: 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20   If tripCode is 
7b90: 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74  not SQLITE_OK, t
7ba0: 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20  hen.** any open 
7bb0: 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  cursors are inva
7bc0: 6c 69 64 61 74 65 64 20 28 22 74 72 69 70 70 65  lidated ("trippe
7bd0: 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70  d" - as in "trip
7be0: 70 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a  ping a circuit.*
7bf0: 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20  * breaker") and 
7c00: 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74  made to return t
7c10: 72 69 70 43 6f 64 65 20 69 66 20 74 68 65 72 65  ripCode if there
7c20: 20 61 72 65 20 61 6e 79 20 66 75 72 74 68 65 72   are any further
7c30: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
7c40: 75 73 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e  use that cursor.
7c50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7c60: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69  RollbackAll(sqli
7c70: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69  te3 *db, int tri
7c80: 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pCode){.  int i;
7c90: 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d  .  int inTrans =
7ca0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
7cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7cc0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
7cd0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
7ce0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
7cf0: 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d  /* Obtain all b-
7d00: 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65 66  tree mutexes bef
7d10: 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63  ore making any c
7d20: 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c  alls to BtreeRol
7d30: 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54  lback(). .  ** T
7d40: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
7d50: 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
7d60: 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72  nsaction being r
7d70: 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20  olled back has. 
7d80: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65   ** modified the
7d90: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
7da0: 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  . If the b-tree 
7db0: 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20  mutexes are not 
7dc0: 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c  taken.  ** here,
7dd0: 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68   then another sh
7de0: 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65  ared-cache conne
7df0: 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61  ction might snea
7e00: 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a  k in between.  *
7e10: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  * the database r
7e20: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
7e30: 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68 20  ma reset, which 
7e40: 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a  can cause false.
7e50: 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
7e60: 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20  reports in some 
7e70: 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c  cases.  */.  sql
7e80: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
7e90: 6c 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  l(db);..  for(i=
7ea0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
7eb0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
7ec0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
7ed0: 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  t;.    if( p ){.
7ee0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7ef0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
7f00: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p) ){.        in
7f10: 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  Trans = 1;.     
7f20: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7f30: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
7f40: 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 20 20   tripCode);.    
7f50: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
7f60: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
7f70: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
7f80: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
7f90: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53  if( (db->flags&S
7fa0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
7fb0: 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  ges)!=0 && db->i
7fc0: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
7fd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
7fe0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
7ff0: 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ts(db);.    sqli
8000: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
8010: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
8020: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
8030: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
8040: 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65  b);..  /* Any de
8050: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
8060: 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76  t violations hav
8070: 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c  e now been resol
8080: 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44  ved. */.  db->nD
8090: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
80a0: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
80b0: 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64  ImmCons = 0;.  d
80c0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
80d0: 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20  ITE_DeferFKs;.. 
80e0: 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62   /* If one has b
80f0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
8100: 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62  invoke the rollb
8110: 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ack-hook callbac
8120: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78  k */.  if( db->x
8130: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
8140: 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20   && (inTrans || 
8150: 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29  !db->autoCommit)
8160: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c   ){.    db->xRol
8170: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62  lbackCallback(db
8180: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b  ->pRollbackArg);
8190: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
81a0: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
81b0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
81c0: 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70  the name corresp
81d0: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72  onding to the er
81e0: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63  ror code.** spec
81f0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72 67  ified in the arg
8200: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65  ument..*/.#if de
8210: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
8220: 54 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  T).const char *s
8230: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e  qlite3ErrName(in
8240: 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63  t rc){.  const c
8250: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
8260: 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20    int i, origRc 
8270: 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = rc;.  for(i=0;
8280: 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30   i<2 && zName==0
8290: 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66  ; i++, rc &= 0xf
82a0: 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  f){.    switch( 
82b0: 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  rc ){.      case
82c0: 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20   SQLITE_OK:     
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
82e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b  e = "SQLITE_OK";
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8310: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
8330: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52  me = "SQLITE_ERR
8340: 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OR";            
8350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8360: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  se SQLITE_INTERN
8370: 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  AL:           zN
8380: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
8390: 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20  TERNAL";        
83a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
83b0: 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a  ase SQLITE_PERM:
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
83d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
83e0: 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERM";           
83f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8400: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
8410: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T:              
8420: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8430: 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20  ABORT";         
8440: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8450: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
8460: 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20  RT_ROLLBACK:    
8470: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8480: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22  _ABORT_ROLLBACK"
8490: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
84a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
84b0: 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SY:             
84c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
84d0: 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20  E_BUSY";        
84e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
84f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
8500: 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20  USY_RECOVERY:   
8510: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8520: 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59  TE_BUSY_RECOVERY
8530: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8540: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8550: 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20  BUSY_SNAPSHOT:  
8560: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8570: 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
8580: 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
8590: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
85a0: 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20  _LOCKED:        
85b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
85c0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20  LITE_LOCKED";   
85d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
85e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
85f0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
8600: 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  ACHE: zName = "S
8610: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
8620: 52 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b  REDCACHE";break;
8630: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8640: 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20  TE_NOMEM:       
8650: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8660: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20  SQLITE_NOMEM";  
8670: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8680: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8690: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20  ITE_READONLY:   
86a0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
86b0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
86c0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
86d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
86e0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45  LITE_READONLY_RE
86f0: 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d  COVERY:  zName =
8700: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
8710: 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65  Y_RECOVERY"; bre
8720: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8730: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
8740: 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20  ANTLOCK:  zName 
8750: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
8760: 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72  LY_CANTLOCK"; br
8770: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8780: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
8790: 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65  ROLLBACK:  zName
87a0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
87b0: 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  NLY_ROLLBACK"; b
87c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
87d0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
87e0: 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d  _DBMOVED:   zNam
87f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
8800: 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20  ONLY_DBMOVED";  
8810: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8820: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
8830: 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61  PT:          zNa
8840: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
8850: 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ERRUPT";        
8860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8870: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a  se SQLITE_IOERR:
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
8890: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
88a0: 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERR";           
88b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
88c0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
88d0: 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a  _READ:         z
88e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
88f0: 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20  OERR_READ";     
8900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8910: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8920: 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20  R_SHORT_READ:   
8930: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8940: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
8950: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
8960: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8970: 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20  RR_WRITE:       
8980: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8990: 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20  _IOERR_WRITE";  
89a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
89b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
89c0: 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20  ERR_FSYNC:      
89d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
89e0: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20  E_IOERR_FSYNC"; 
89f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8a00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8a10: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20  OERR_DIR_FSYNC: 
8a20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8a30: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
8a40: 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  NC";   break;.  
8a50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8a60: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20  IOERR_TRUNCATE: 
8a70: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8a80: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
8a90: 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TE";    break;. 
8aa0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8ab0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20  _IOERR_FSTAT:   
8ac0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8ad0: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
8ae0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
8af0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8b00: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20  E_IOERR_UNLOCK: 
8b10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8b20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
8b30: 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  CK";      break;
8b40: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8b50: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a  TE_IOERR_RDLOCK:
8b60: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8b70: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
8b80: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
8b90: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8ba0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
8bb0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
8bc0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
8bd0: 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65 61  LETE";      brea
8be0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8bf0: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
8c00: 45 44 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ED:      zName =
8c10: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42   "SQLITE_IOERR_B
8c20: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 62 72 65  LOCKED";     bre
8c30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8c40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
8c50: 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  M:        zName 
8c60: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8c70: 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72  NOMEM";       br
8c80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8c90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
8ca0: 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ESS:       zName
8cb0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8cc0: 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20 62  _ACCESS";      b
8cd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8ce0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
8cf0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a  ECKRESERVEDLOCK:
8d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d20: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8d30: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
8d40: 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  RVEDLOCK"; break
8d50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8d60: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20  ITE_IOERR_LOCK: 
8d70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8d80: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f  "SQLITE_IOERR_LO
8d90: 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  CK";        brea
8da0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8db0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
8dc0: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
8dd0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
8de0: 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72 65  LOSE";       bre
8df0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8e00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
8e10: 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20  CLOSE:    zName 
8e20: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8e30: 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72  DIR_CLOSE";   br
8e40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8e50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
8e60: 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65  OPEN:      zName
8e70: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8e80: 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62  _SHMOPEN";     b
8e90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8ea0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
8eb0: 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d  MSIZE:      zNam
8ec0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8ed0: 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20  R_SHMSIZE";     
8ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8ef0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8f00: 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61  HMLOCK:      zNa
8f10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8f20: 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20  RR_SHMLOCK";    
8f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8f40: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8f50: 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e  SHMMAP:       zN
8f60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8f70: 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20  ERR_SHMMAP";    
8f80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8f90: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8fa0: 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a  _SEEK:         z
8fb0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8fc0: 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20  OERR_SEEK";     
8fd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8fe0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8ff0: 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20  R_DELETE_NOENT: 
9000: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9010: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
9020: 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  NT";break;.     
9030: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
9040: 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20  RR_MMAP:        
9050: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9060: 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20  _IOERR_MMAP";   
9070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9080: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
9090: 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a  ERR_GETTEMPPATH:
90a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
90b0: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
90c0: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
90d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
90e0: 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OERR_CONVPATH:  
90f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9100: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
9110: 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  H";    break;.  
9120: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9130: 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  CORRUPT:        
9140: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9150: 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20  ITE_CORRUPT";   
9160: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9170: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9180: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20  _CORRUPT_VTAB:  
9190: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
91a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
91b0: 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  B";      break;.
91c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
91d0: 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20  E_NOTFOUND:     
91e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
91f0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b  QLITE_NOTFOUND";
9200: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9210: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9220: 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20  TE_FULL:        
9230: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9240: 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20  SQLITE_FULL";   
9250: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9260: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9270: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20  ITE_CANTOPEN:   
9280: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9290: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
92a0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
92b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
92c0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
92d0: 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d  TEMPDIR: zName =
92e0: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
92f0: 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65  N_NOTEMPDIR";bre
9300: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9310: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
9320: 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20  SDIR:     zName 
9330: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
9340: 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72  EN_ISDIR";    br
9350: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9360: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
9370: 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65  FULLPATH:  zName
9380: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
9390: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62  PEN_FULLPATH"; b
93a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
93b0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
93c0: 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d  _CONVPATH:  zNam
93d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
93e0: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20  OPEN_CONVPATH"; 
93f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9400: 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  e SQLITE_PROTOCO
9410: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
9420: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f  me = "SQLITE_PRO
9430: 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20  TOCOL";         
9440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9450: 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a  se SQLITE_EMPTY:
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9470: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d  ame = "SQLITE_EM
9480: 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  PTY";           
9490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
94a0: 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ase SQLITE_SCHEM
94b0: 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  A:             z
94c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53  Name = "SQLITE_S
94d0: 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20  CHEMA";         
94e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
94f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42  case SQLITE_TOOB
9500: 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  IG:             
9510: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9520: 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20  TOOBIG";        
9530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9540: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9550: 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20  STRAINT:        
9560: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9570: 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20  _CONSTRAINT";   
9580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9590: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
95a0: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a  NSTRAINT_UNIQUE:
95b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
95c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
95d0: 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  QUE"; break;.   
95e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
95f0: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
9600: 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  R: zName = "SQLI
9610: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
9620: 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20  IGGER";break;.  
9630: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9640: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
9650: 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20  GNKEY:.         
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9680: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9690: 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20  T_FOREIGNKEY";  
96a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
96b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
96c0: 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e  AINT_CHECK:   zN
96d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
96e0: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b  NSTRAINT_CHECK";
96f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9700: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9710: 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
9720: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9750: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
9760: 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61  MARYKEY";   brea
9770: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9780: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9790: 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d  NOTNULL: zName =
97a0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
97b0: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65  INT_NOTNULL";bre
97c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
97d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
97e0: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20  _COMMITHOOK:.   
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9810: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
9820: 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
9830: 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OK";   break;.  
9840: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9850: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a  CONSTRAINT_VTAB:
9860: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9870: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
9880: 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  TAB";   break;. 
9890: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
98a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
98b0: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20  TION:.          
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
98e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
98f0: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20  _FUNCTION";     
9900: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9910: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9920: 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61  INT_ROWID:   zNa
9930: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
9940: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20  STRAINT_ROWID"; 
9950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9960: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  se SQLITE_MISMAT
9970: 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  CH:           zN
9980: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
9990: 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20  SMATCH";        
99a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
99b0: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
99c0: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
99d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
99e0: 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20  ISUSE";         
99f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9a00: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
9a10: 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S:              
9a20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9a30: 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20  NOLFS";         
9a40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9a50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54   case SQLITE_AUT
9a60: 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H:              
9a70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9a80: 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 20  _AUTH";         
9a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9aa0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
9ab0: 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20  RMAT:           
9ac0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9ad0: 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20  E_FORMAT";      
9ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9af0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
9b00: 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20  ANGE:           
9b10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9b20: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
9b30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9b40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9b50: 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20 20  NOTADB:         
9b60: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9b70: 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20  ITE_NOTADB";    
9b80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9b90: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9ba0: 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20  _ROW:           
9bb0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9bc0: 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20  LITE_ROW";      
9bd0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9be0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9bf0: 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20  E_NOTICE:       
9c00: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9c10: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20  QLITE_NOTICE";  
9c20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9c30: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9c40: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
9c50: 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22  R_WAL: zName = "
9c60: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
9c70: 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b  COVER_WAL";break
9c80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9c90: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
9ca0: 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20  ER_ROLLBACK:.   
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9cd0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
9ce0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
9cf0: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
9d00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9d10: 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20  WARNING:        
9d20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9d30: 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20  ITE_WARNING";   
9d40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9d50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9d60: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
9d70: 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  EX:  zName = "SQ
9d80: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
9d90: 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  OINDEX"; break;.
9da0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9db0: 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  E_DONE:         
9dc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9dd0: 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20  QLITE_DONE";    
9de0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9df0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
9e00: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
9e10: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42 75   static char zBu
9e20: 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  f[50];.    sqlit
9e30: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
9e40: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
9e50: 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28  "SQLITE_UNKNOWN(
9e60: 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20  %d)", origRc);. 
9e70: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b     zName = zBuf;
9e80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
9e90: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
9ea0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
9eb0: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
9ec0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
9ed0: 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
9ee0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
9ef0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f   argument..*/.co
9f00: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
9f10: 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b  3ErrStr(int rc){
9f20: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
9f30: 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67  char* const aMsg
9f40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51  [] = {.    /* SQ
9f50: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
9f60: 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f   */ "not an erro
9f70: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
9f80: 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f  E_ERROR       */
9f90: 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   "SQL logic erro
9fa0: 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74  r or missing dat
9fb0: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
9fc0: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20  QLITE_INTERNAL  
9fd0: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
9fe0: 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20  QLITE_PERM      
9ff0: 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72    */ "access per
a000: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c  mission denied",
a010: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
a020: 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63  BORT       */ "c
a030: 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65  allback requeste
a040: 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a  d query abort",.
a050: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55      /* SQLITE_BU
a060: 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  SY        */ "da
a070: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
a080: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a090: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20  _LOCKED      */ 
a0a0: 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
a0b0: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
a0c0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  /* SQLITE_NOMEM 
a0d0: 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66        */ "out of
a0e0: 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a   memory",.    /*
a0f0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
a100: 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20      */ "attempt 
a110: 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f  to write a reado
a120: 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20  nly database",. 
a130: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
a140: 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74  ERRUPT   */ "int
a150: 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f  errupted",.    /
a160: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20  * SQLITE_IOERR  
a170: 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f       */ "disk I/
a180: 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  O error",.    /*
a190: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
a1a0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
a1b0: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
a1c0: 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f  alformed",.    /
a1d0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  * SQLITE_NOTFOUN
a1e0: 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e  D    */ "unknown
a1f0: 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20   operation",.   
a200: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   /* SQLITE_FULL 
a210: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
a220: 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
a230: 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ull",.    /* SQL
a240: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20  ITE_CANTOPEN    
a250: 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  */ "unable to op
a260: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
a270: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a280: 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20  _PROTOCOL    */ 
a290: 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f  "locking protoco
a2a0: 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  l",.    /* SQLIT
a2b0: 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f  E_EMPTY       */
a2c0: 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73   "table contains
a2d0: 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f   no data",.    /
a2e0: 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  * SQLITE_SCHEMA 
a2f0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
a300: 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61  e schema has cha
a310: 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nged",.    /* SQ
a320: 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20  LITE_TOOBIG     
a330: 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62   */ "string or b
a340: 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20  lob too big",.  
a350: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53    /* SQLITE_CONS
a360: 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73  TRAINT  */ "cons
a370: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a  traint failed",.
a380: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
a390: 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61  SMATCH    */ "da
a3a0: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22  tatype mismatch"
a3b0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a3c0: 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22  MISUSE      */ "
a3d0: 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20  library routine 
a3e0: 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65  called out of se
a3f0: 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20  quence",.    /* 
a400: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20  SQLITE_NOLFS    
a410: 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c     */ "large fil
a420: 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73  e support is dis
a430: 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  abled",.    /* S
a440: 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20  QLITE_AUTH      
a450: 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74    */ "authorizat
a460: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
a470: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41   /* SQLITE_FORMA
a480: 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c  T      */ "auxil
a490: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f  iary database fo
a4a0: 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20  rmat error",.   
a4b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45   /* SQLITE_RANGE
a4c0: 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20         */ "bind 
a4d0: 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  or column index 
a4e0: 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20  out of range",. 
a4f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
a500: 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c  ADB      */ "fil
a510: 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f  e is encrypted o
a520: 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62  r is not a datab
a530: 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e  ase",.  };.  con
a540: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
a550: 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b  "unknown error";
a560: 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b  .  switch( rc ){
a570: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
a580: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a  _ABORT_ROLLBACK:
a590: 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20   {.      zErr = 
a5a0: 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52 4f  "abort due to RO
a5b0: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 62  LLBACK";.      b
a5c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a5d0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
a5e0: 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 20   rc &= 0xff;.   
a5f0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 72 63     if( ALWAYS(rc
a600: 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72 61 79  >=0) && rc<Array
a610: 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20 61 4d  Size(aMsg) && aM
a620: 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20  sg[rc]!=0 ){.   
a630: 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d 73 67       zErr = aMsg
a640: 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [rc];.      }.  
a650: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a660: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45  .  }.  return zE
a670: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rr;.}../*.** Thi
a680: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
a690: 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c  ents a busy call
a6a0: 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73  back that sleeps
a6b0: 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67   and tries.** ag
a6c0: 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65  ain until a time
a6d0: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61  out value is rea
a6e0: 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f  ched.  The timeo
a6f0: 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  ut value is.** a
a700: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
a710: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
a720: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68   passed in as th
a730: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
a740: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
a750: 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  nt sqliteDefault
a760: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76  BusyCallback(. v
a770: 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20  oid *ptr,       
a780: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a790: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a7a0: 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20  /. int count    
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a7c0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
a7d0: 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75  able has been bu
a7e0: 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c  sy */.){.#if SQL
a7f0: 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28 64  ITE_OS_WIN || (d
a800: 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
a810: 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
a820: 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EP).  static con
a830: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
a840: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
a850: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
a860: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
a870: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
a880: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
a890: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
a8a0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
a8b0: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
a8c0: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
a8d0: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
a8e0: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
a8f0: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
a900: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
a910: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
a920: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
a930: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
a940: 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65  , prior;..  asse
a950: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
a960: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
a970: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
a980: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
a990: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
a9a0: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
a9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
a9c0: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
a9d0: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
a9e0: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
a9f0: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
aa00: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
aa10: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
aa20: 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20  delay > timeout 
aa30: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
aa40: 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a  imeout - prior;.
aa50: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
aa60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
aa70: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
aa80: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
aa90: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
aaa0: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  n 1;.#else.  sql
aab0: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
aac0: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
aad0: 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c   timeout = ((sql
aae0: 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73  ite3 *)ptr)->bus
aaf0: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20  yTimeout;.  if( 
ab00: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
ab10: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
ab20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ab30: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
ab40: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
ab50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
ab60: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
ab70: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
ab80: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
ab90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
aba0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
abb0: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
abc0: 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e  led with a lock.
abd0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
abe0: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
abf0: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
ac00: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
ac10: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
ac20: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
ac30: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
ac40: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
ac50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
ac60: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
ac70: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b  BusyHandler *p){
ac80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
ac90: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20   NEVER(p==0) || 
aca0: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70  p->xFunc==0 || p
acb0: 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75  ->nBusy<0 ) retu
acc0: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  rn 0;.  rc = p->
acd0: 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70  xFunc(p->pArg, p
ace0: 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20  ->nBusy);.  if( 
acf0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  rc==0 ){.    p->
ad00: 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  nBusy = -1;.  }e
ad10: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  lse{.    p->nBus
ad20: 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  y++;.  }.  retur
ad30: 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n rc; .}../*.** 
ad40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
ad50: 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  s the busy callb
ad60: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
ad70: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
ad80: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
ad90: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
ada0: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
adb0: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
adc0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
add0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
ade0: 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  ,.  int (*xBusy)
adf0: 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76  (void*,int),.  v
ae00: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
ae10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ae20: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
ae30: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
ae40: 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a  .xFunc = xBusy;.
ae50: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
ae60: 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  r.pArg = pArg;. 
ae70: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
ae80: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62  .nBusy = 0;.  db
ae90: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
aea0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
aeb0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
aec0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
aed0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
aee0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
aef0: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
af00: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
af10: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
af20: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
af30: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
af40: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
af50: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
af60: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
af70: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
af80: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
af90: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
afa0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
afb0: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
afc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
afd0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
afe0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
aff0: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
b000: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
b010: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
b020: 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74  *pArg.){.  sqlit
b030: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
b040: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
b050: 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64   nOps>0 ){.    d
b060: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78  b->xProgress = x
b070: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62  Progress;.    db
b080: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
b090: 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b   (unsigned)nOps;
b0a0: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
b0b0: 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ssArg = pArg;.  
b0c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78  }else{.    db->x
b0d0: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
b0e0: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
b0f0: 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ps = 0;.    db->
b100: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30  pProgressArg = 0
b110: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
b120: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
b130: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
b140: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
b150: 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61  utine installs a
b160: 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61   default busy ha
b170: 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73  ndler that waits
b180: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63   for the.** spec
b190: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ified number of 
b1a0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66  milliseconds bef
b1b0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e  ore returning 0.
b1c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
b1d0: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c  busy_timeout(sql
b1e0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73  ite3 *db, int ms
b1f0: 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  ){.  if( ms>0 ){
b200: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
b210: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
b220: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
b230: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
b240: 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73  db);.    db->bus
b250: 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20  yTimeout = ms;. 
b260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
b270: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
b280: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
b290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b2a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
b2b0: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
b2c0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
b2d0: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
b2e0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
b2f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
b300: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
b310: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e 69  *db){.  db->u1.i
b320: 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31  sInterrupted = 1
b330: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
b340: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61   function is exa
b350: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73  ctly the same as
b360: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
b370: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65  function(), exce
b380: 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  pt.** that it is
b390: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20   designed to be 
b3a0: 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e  called by intern
b3b0: 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66  al code. The dif
b3c0: 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68  ference is.** th
b3d0: 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  at if a malloc()
b3e0: 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65   fails in sqlite
b3f0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
b400: 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  n(), an error co
b410: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
b420: 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63  d and the malloc
b430: 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61  Failed flag clea
b440: 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  red. .*/.int sql
b450: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a  ite3CreateFunc(.
b460: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
b470: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
b480: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
b490: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
b4a0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72  c,.  void *pUser
b4b0: 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78  Data,.  void (*x
b4c0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
b4d0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
b4e0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
b4f0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
b500: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
b510: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
b520: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
b530: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
b540: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63  ontext*),.  Func
b550: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
b560: 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e  tructor.){.  Fun
b570: 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cDef *p;.  int n
b580: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72  Name;.  int extr
b590: 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72  aFlags;..  asser
b5a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b5b0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
b5c0: 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74   );.  if( zFunct
b5d0: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20  ionName==0 ||.  
b5e0: 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78      (xFunc && (x
b5f0: 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29  Final || xStep))
b600: 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75   || .      (!xFu
b610: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26  nc && (xFinal &&
b620: 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20   !xStep)) ||.   
b630: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21     (!xFunc && (!
b640: 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29  xFinal && xStep)
b650: 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67  ) ||.      (nArg
b660: 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49  <-1 || nArg>SQLI
b670: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
b680: 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32  ARG) ||.      (2
b690: 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  55<(nName = sqli
b6a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75  te3Strlen30( zFu
b6b0: 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b  nctionName))) ){
b6c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b6d0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
b6e0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53    }..  assert( S
b6f0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
b700: 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45  ANT==SQLITE_DETE
b710: 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65  RMINISTIC );.  e
b720: 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20  xtraFlags = enc 
b730: 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  &  SQLITE_DETERM
b740: 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26  INISTIC;.  enc &
b750: 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45  = (SQLITE_FUNC_E
b760: 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e  NCMASK|SQLITE_AN
b770: 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53  Y);.  .#ifndef S
b780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
b790: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
b7a0: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
b7b0: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
b7c0: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
b7d0: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
b7e0: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
b7f0: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
b800: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
b810: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
b820: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
b830: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
b840: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
b850: 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ally..  **.  ** 
b860: 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73  If SQLITE_ANY is
b870: 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20   specified, add 
b880: 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
b890: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20  f the function. 
b8a0: 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20   ** to the hash 
b8b0: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
b8c0: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ( enc==SQLITE_UT
b8d0: 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d  F16 ){.    enc =
b8e0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
b8f0: 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  IVE;.  }else if(
b900: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59   enc==SQLITE_ANY
b910: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
b920: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b930: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
b940: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
b950: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c  rg, SQLITE_UTF8|
b960: 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20  extraFlags,.    
b970: 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20       pUserData, 
b980: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
b990: 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f  inal, pDestructo
b9a0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
b9b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b9c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
b9d0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
b9e0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
b9f0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  g, SQLITE_UTF16L
ba00: 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20  E|extraFlags,.  
ba10: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
ba20: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
ba30: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
ba40: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ctor);.    }.   
ba50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ba60: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
ba70: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
ba80: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
ba90: 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  F16BE;.  }.#else
baa0: 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  .  enc = SQLITE_
bab0: 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  UTF8;.#endif.  .
bac0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
bad0: 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69   existing functi
bae0: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  on is being over
baf0: 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65  ridden or delete
bb00: 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61  d. If so,.  ** a
bb10: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
bb20: 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65  ive VMs, then re
bb30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
bb40: 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a  . If a function.
bb50: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76    ** is being ov
bb60: 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64  erridden/deleted
bb70: 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e   but there are n
bb80: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c  o active VMs, al
bb90: 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  low the.  ** ope
bba0: 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e  ration to contin
bbb0: 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74  ue but invalidat
bbc0: 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65  e all precompile
bbd0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
bbe0: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
bbf0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
bc00: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
bc10: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
bc20: 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  )enc, 0);.  if( 
bc30: 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61  p && (p->funcFla
bc40: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
bc50: 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26  _ENCMASK)==enc &
bc60: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
bc70: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
bc80: 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
bc90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bca0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
bcb0: 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
bcc0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
bcd0: 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  ify user-functio
bce0: 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  n due to active 
bcf0: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
bd00: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
bd10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
bd20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
bd30: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
bd40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
bd50: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
bd60: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
bd70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20  .    }.  }..  p 
bd80: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
bd90: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
bda0: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
bdb0: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31  nArg, (u8)enc, 1
bdc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c  );.  assert(p ||
bdd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
bde0: 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  d);.  if( !p ){.
bdf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
be00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
be10: 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76  /* If an older v
be20: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75  ersion of the fu
be30: 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f  nction with a co
be40: 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75 63  nfigured destruc
be50: 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e  tor is.  ** bein
be60: 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b  g replaced invok
be70: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
be80: 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20   function here. 
be90: 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73  */.  functionDes
bea0: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20  troy(db, p);..  
beb0: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
bec0: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
bed0: 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  or->nRef++;.  }.
bee0: 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72    p->pDestructor
bef0: 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a   = pDestructor;.
bf00: 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d    p->funcFlags =
bf10: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
bf20: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43   SQLITE_FUNC_ENC
bf30: 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61  MASK) | extraFla
bf40: 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  gs;.  testcase( 
bf50: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
bf60: 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
bf70: 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46 75 6e  TIC );.  p->xFun
bf80: 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e  c = xFunc;.  p->
bf90: 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20  xStep = xStep;. 
bfa0: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
bfb0: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
bfc0: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
bfd0: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
bfe0: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
bff0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c000: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
c010: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
c020: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
c030: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c040: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
c050: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
c060: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
c070: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
c080: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
c090: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
c0a0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
c0b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
c0c0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
c0d0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c0e0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
c0f0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
c100: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
c110: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
c120: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
c130: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
c140: 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  v2(db, zFunc, nA
c150: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
c160: 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20  c, xStep,.      
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46                xF
c190: 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74  inal, 0);.}..int
c1a0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c1b0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73  function_v2(.  s
c1c0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
c1d0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
c1e0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
c1f0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
c200: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
c210: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
c220: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c230: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
c240: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
c250: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
c260: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c270: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
c280: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
c290: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
c2a0: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
c2b0: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
c2c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
c2d0: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
c2e0: 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pArg = 0;.  sqli
c2f0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c300: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
c310: 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( xDestroy ){.  
c320: 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65    pArg = (FuncDe
c330: 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74  structor *)sqlit
c340: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
c350: 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  b, sizeof(FuncDe
c360: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
c370: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
c380: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
c390: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
c3a0: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
c3b0: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
c3c0: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
c3d0: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
c3e0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
c3f0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
c400: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
c410: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
c420: 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b  , xFinal, pArg);
c430: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
c440: 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  Arg->nRef==0 ){.
c450: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
c460: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
c470: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
c480: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c490: 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a  db, pArg);.  }..
c4a0: 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c   out:.  rc = sql
c4b0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
c4c0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
c4d0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
c4e0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
c4f0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
c500: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
c510: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
c520: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a  ate_function16(.
c530: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
c540: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75   const void *zFu
c550: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
c560: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54  t nArg,.  int eT
c570: 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a  extRep,.  void *
c580: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
c590: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
c5a0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c5b0: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
c5c0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
c5d0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
c5e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
c5f0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
c600: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
c610: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
c620: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b  .  char *zFunc8;
c630: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c640: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
c650: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
c660: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c670: 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c  ;.  zFunc8 = sql
c680: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
c690: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
c6a0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
c6b0: 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20  NATIVE);.  rc = 
c6c0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
c6d0: 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
c6e0: 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
c6f0: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
c700: 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69  Final,0);.  sqli
c710: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46  te3DbFree(db, zF
c720: 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71  unc8);.  rc = sq
c730: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
c740: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
c750: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
c760: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
c770: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a   rc;.}.#endif...
c780: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68  /*.** Declare th
c790: 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  at a function ha
c7a0: 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65  s been overloade
c7b0: 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74  d by a virtual t
c7c0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
c7d0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65  he function alre
c7e0: 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20  ady exists as a 
c7f0: 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66  regular global f
c800: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a  unction, then.**
c810: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
c820: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68   a no-op.  If th
c830: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
c840: 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
c850: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
c860: 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20  one that always 
c870: 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d  throws a run-tim
c880: 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a  e error.  .**.**
c890: 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61   When virtual ta
c8a0: 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70  bles intend to p
c8b0: 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f  rovide an overlo
c8c0: 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74  aded function, t
c8d0: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61  hey.** should ca
c8e0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
c8f0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
c900: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
c910: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c   exists..** A gl
c920: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75  obal function mu
c930: 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65  st exist in orde
c940: 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c  r for name resol
c950: 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a  ution to work.**
c960: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e   properly..*/.in
c970: 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  t sqlite3_overlo
c980: 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ad_function(.  s
c990: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
c9a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
c9b0: 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20  .  int nArg.){. 
c9c0: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
c9d0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
c9e0: 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  me);.  int rc = 
c9f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
ca00: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ca10: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
ca20: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75  f( sqlite3FindFu
ca30: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
ca40: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , nName, nArg, S
ca50: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d  QLITE_UTF8, 0)==
ca60: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
ca70: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
ca80: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
ca90: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
cac0: 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69  te3InvalidFuncti
cad0: 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  on, 0, 0, 0);.  
cae0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
caf0: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
cb00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
cb10: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
cb20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
cb30: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
cb40: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
cb50: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72  ** Register a tr
cb60: 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ace function.  T
cb70: 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
cb80: 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
cb90: 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20  stered trace.** 
cba0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
cbb0: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63  *.** A NULL trac
cbc0: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
cbd0: 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67   that no tracing
cbe0: 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
cbf0: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61   non-NULL.** tra
cc00: 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ce is a pointer 
cc10: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
cc20: 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
cc30: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
cc40: 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  ch.** SQL statem
cc50: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ent..*/.void *sq
cc60: 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69  lite3_trace(sqli
cc70: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a  te3 *db, void (*
cc80: 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f  xTrace)(void*,co
cc90: 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64  nst char*), void
cca0: 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20   *pArg){.  void 
ccb0: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
ccc0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ccd0: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
cce0: 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b  = db->pTraceArg;
ccf0: 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
cd00: 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
cd10: 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
cd20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cd30: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
cd40: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
cd50: 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .}./*.** Registe
cd60: 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  r a profile func
cd70: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
cd80: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
cd90: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a  sly registered .
cda0: 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  ** profile funct
cdb0: 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ion is returned.
cdc0: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
cdd0: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
cde0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70   means that no p
cdf0: 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63  rofiling is exec
ce00: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
ce10: 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20  L.** profile is 
ce20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
ce30: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
ce40: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
ce50: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20  onclusion of.** 
ce60: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
ce70: 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a  nt that is run..
ce80: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
ce90: 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69  _profile(.  sqli
cea0: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
ceb0: 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64  (*xProfile)(void
cec0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
ced0: 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20  lite_uint64),.  
cee0: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
cef0: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
cf00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
cf10: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
cf20: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66  pOld = db->pProf
cf30: 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ileArg;.  db->xP
cf40: 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c  rofile = xProfil
cf50: 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c  e;.  db->pProfil
cf60: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
cf70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
cf80: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
cf90: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
cfa0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cfb0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a  _OMIT_TRACE */..
cfc0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
cfd0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
cfe0: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
cff0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
d000: 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
d010: 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
d020: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
d030: 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
d040: 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
d050: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
d060: 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
d070: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
d080: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
d090: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
d0a0: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
d0b0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
d0c0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
d0d0: 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
d0e0: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
d0f0: 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
d100: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
d110: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
d120: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
d130: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
d140: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
d150: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d160: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
d170: 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  d = db->pCommitA
d180: 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69  rg;.  db->xCommi
d190: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  tCallback = xCal
d1a0: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f  lback;.  db->pCo
d1b0: 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a  mmitArg = pArg;.
d1c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d1d0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
d1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
d200: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
d210: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
d220: 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
d230: 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
d240: 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
d250: 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
d260: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
d270: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
d280: 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73  update_hook(.  s
d290: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
d2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
d2b0: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
d2c0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
d2d0: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
d2e0: 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
d2f0: 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20  ar const *,char 
d300: 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69  const *,sqlite_i
d310: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
d320: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
d330: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
d340: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
d350: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
d360: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
d370: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d380: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
d390: 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20  ->pUpdateArg;.  
d3a0: 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
d3b0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
d3c0: 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72  .  db->pUpdateAr
d3d0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
d3e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d3f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
d400: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
d410: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
d420: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
d430: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
d440: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
d450: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
d460: 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
d470: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
d480: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f  void *sqlite3_ro
d490: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73  llback_hook(.  s
d4a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
d4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
d4c0: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
d4d0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
d4e0: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
d4f0: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43  ck)(void*), /* C
d500: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
d510: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
d540: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
d550: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
d560: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d570: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d580: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
d590: 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64  RollbackArg;.  d
d5a0: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
d5b0: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
d5c0: 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ;.  db->pRollbac
d5d0: 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  kArg = pArg;.  s
d5e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d5f0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d600: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
d610: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d620: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
d630: 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  HOOK./*.** Regis
d640: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
d650: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
d660: 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
d670: 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
d680: 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
d690: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
d6a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
d6b0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
d6c0: 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28  _preupdate_hook(
d6d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d6f0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
d700: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
d710: 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c   */.  void(*xCal
d720: 6c 62 61 63 6b 29 28 20 20 20 20 20 20 20 20 20  lback)(         
d730: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
d740: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  tion */.    void
d750: 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63  *,sqlite3*,int,c
d760: 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20  har const*,char 
d770: 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69  const*,sqlite3_i
d780: 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74  nt64,sqlite3_int
d790: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
d7a0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
d7b0: 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61   /* First callba
d7c0: 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ck argument */.)
d7d0: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
d7e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d7f0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d800: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
d810: 50 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20  PreUpdateArg;.  
d820: 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61  db->xPreUpdateCa
d830: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d840: 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  ck;.  db->pPreUp
d850: 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  dateArg = pArg;.
d860: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d870: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d880: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
d890: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d8a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
d8b0: 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69  DATE_HOOK */..#i
d8c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d8d0: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20  T_WAL./*.** The 
d8e0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
d8f0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  () callback regi
d900: 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65  stered by sqlite
d910: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
d920: 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b  oint()..** Invok
d930: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
d940: 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
d950: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
d960: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
d970: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
d980: 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c  han sqlite3.pWal
d990: 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69  Arg cast to an i
d9a0: 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75  nteger (the valu
d9b0: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a  e configured by.
d9c0: 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  ** wal_autocheck
d9d0: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e  point())..*/ .in
d9e0: 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  t sqlite3WalDefa
d9f0: 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20  ultHook(.  void 
da00: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  *pClientData,   
da10: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f    /* Argument */
da20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
da30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
da40: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
da50: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
da60: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
da70: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20  */.  int nFrame 
da80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
da90: 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b  ize of WAL */.){
daa0: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53  .  if( nFrame>=S
dab0: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
dac0: 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b  (pClientData) ){
dad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
dae0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
daf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
db00: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
db10: 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  zDb);.    sqlite
db20: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
db30: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
db40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
db50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
db60: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
db70: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
db80: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
db90: 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  ) callback to au
dba0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
dbb0: 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61  kpoint.** a data
dbc0: 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69  base after commi
dbd0: 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
dbe0: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
dbf0: 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f   nFrame or.** mo
dc00: 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  re frames in the
dc10: 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69   log file. Passi
dc20: 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67  ng zero or a neg
dc30: 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74  ative value as t
dc40: 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72  he.** nFrame par
dc50: 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20  ameter disables 
dc60: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
dc70: 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a  oints entirely..
dc80: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
dc90: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
dca0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
dcb0: 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73  eplaces any exis
dcc0: 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ting callback.**
dcd0: 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   registered usin
dce0: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
dcf0: 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20  ok(). Likewise, 
dd00: 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61  registering a ca
dd10: 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  llback.** using 
dd20: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dd30: 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  () disables the 
dd40: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
dd50: 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  oint mechanism.*
dd60: 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
dd70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
dd80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
dd90: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
dda0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
ddb0: 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65  t nFrame){.#ifde
ddc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
ddd0: 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  L.  UNUSED_PARAM
dde0: 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
ddf0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72  ED_PARAMETER(nFr
de00: 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ame);.#else.  if
de10: 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20  ( nFrame>0 ){.  
de20: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
de30: 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61  ok(db, sqlite3Wa
de40: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51  lDefaultHook, SQ
de50: 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
de60: 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  nFrame));.  }els
de70: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  e{.    sqlite3_w
de80: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30  al_hook(db, 0, 0
de90: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
dea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
deb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
dec0: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
ded0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
dee0: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
def0: 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a  tion is written.
df00: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74  ** into the writ
df10: 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74  e-ahead-log by t
df20: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
df30: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
df40: 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f   *sqlite3_wal_ho
df50: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
df60: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
df70: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
df80: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
df90: 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
dfa0: 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  int(*xCallback)(
dfb0: 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a  void *, sqlite3*
dfc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
dfd0: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
dfe0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
dff0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
e000: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
e010: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
e020: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
e030: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76  ITE_OMIT_WAL.  v
e040: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
e050: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
e060: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
e070: 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72  Ret = db->pWalAr
e080: 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c  g;.  db->xWalCal
e090: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
e0a0: 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67  k;.  db->pWalArg
e0b0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
e0c0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e0d0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e0e0: 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a  urn pRet;.#else.
e0f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
e100: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
e110: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
e120: 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zDb..*/.int sqli
e130: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
e140: 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  nt_v2(.  sqlite3
e150: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
e160: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
e170: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
e180: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
e190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e1a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61   /* Name of atta
e1b0: 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f  ched database (o
e1c0: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
e1d0: 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20   eMode,         
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e1f0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
e200: 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  T_* value */.  i
e210: 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20  nt *pnLog,      
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e230: 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57  * OUT: Size of W
e240: 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73  AL log in frames
e250: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70   */.  int *pnCkp
e260: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
e270: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
e280: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  tal number of fr
e290: 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65  ames checkpointe
e2a0: 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  d */.){.#ifdef S
e2b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
e2c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e2d0: 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  K;.#else.  int r
e2e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
e2f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e300: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
e310: 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f  nt iDb = SQLITE_
e320: 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f  MAX_ATTACHED;  /
e330: 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20  * sqlite3.aDb[] 
e340: 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63  index of db to c
e350: 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  heckpoint */..  
e360: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
e370: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
e380: 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65  es to -1 in case
e390: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
e3a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67  . */.  if( pnLog
e3b0: 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a   ) *pnLog = -1;.
e3c0: 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a    if( pnCkpt ) *
e3d0: 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20  pnCkpt = -1;..  
e3e0: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
e3f0: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53  HECKPOINT_FULL>S
e400: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e410: 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73  _PASSIVE );.  as
e420: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
e430: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c  CKPOINT_FULL<SQL
e440: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
e450: 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65  ESTART );.  asse
e460: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
e470: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d  POINT_PASSIVE+2=
e480: 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
e490: 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20  NT_RESTART );.  
e4a0: 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
e4b0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
e4c0: 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
e4d0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
e4e0: 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65  ESTART ){.    re
e4f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
e500: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
e510: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
e520: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
e530: 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
e540: 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
e550: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
e560: 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
e570: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
e580: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
e590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
e5a0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  or(db, SQLITE_ER
e5b0: 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  ROR, "unknown da
e5c0: 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62  tabase: %s", zDb
e5d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e5e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63  rc = sqlite3Chec
e5f0: 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20  kpoint(db, iDb, 
e600: 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
e610: 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ckpt);.    sqlit
e620: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
e630: 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  0);.  }.  rc = s
e640: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
e650: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
e660: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
e670: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
e680: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
e690: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
e6a0: 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20  t database zDb. 
e6b0: 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  If zDb is NULL, 
e6c0: 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72  or if the buffer
e6d0: 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zDb points.** t
e6e0: 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72  o contains a zer
e6f0: 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c  o-length string,
e700: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
e710: 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20  tabases are .** 
e720: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
e730: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
e740: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  _checkpoint(sqli
e750: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
e760: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74  har *zDb){.  ret
e770: 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  urn sqlite3_wal_
e780: 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62  checkpoint_v2(db
e790: 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48  , zDb, SQLITE_CH
e7a0: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
e7b0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e  , 0, 0);.}..#ifn
e7c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e7d0: 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  WAL./*.** Run a 
e7e0: 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61  checkpoint on da
e7f0: 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73  tabase iDb. This
e800: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64   is a no-op if d
e810: 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a  atabase iDb is.*
e820: 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  * not currently 
e830: 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
e840: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
e850: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
e860: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
e870: 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
e880: 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  ted, this .** fu
e890: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
e8a0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64  QLITE_LOCKED and
e8b0: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73   a checkpoint is
e8c0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20   not attempted. 
e8d0: 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
e8e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e  occurs while run
e8f0: 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f  ning the checkpo
e900: 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  int, an SQLite e
e910: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
e920: 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20   returned (i.e. 
e930: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f  SQLITE_IOERR). O
e940: 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
e950: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  _OK..**.** The m
e960: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
e970: 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c   handle db shoul
e980: 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65  d be held by the
e990: 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74   caller. The mut
e9a0: 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  ex.** associated
e9b0: 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
e9c0: 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  ic b-tree being 
e9d0: 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20  checkpointed is 
e9e0: 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73  taken by.** this
e9f0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
ea00: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
ea10: 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s running..**.**
ea20: 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65   If iDb is passe
ea30: 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  d SQLITE_MAX_ATT
ea40: 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20  ACHED, then all 
ea50: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
ea60: 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70  es are.** checkp
ea70: 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72  ointed. If an er
ea80: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
ea90: 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  ed it is returne
eaa0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a  d immediately -.
eab0: 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73  ** no attempt is
eac0: 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
ead0: 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e  int any remainin
eae0: 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  g databases..**.
eaf0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  ** Parameter eMo
eb00: 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c  de is one of SQL
eb10: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
eb20: 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20  ASSIVE, FULL or 
eb30: 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20  RESTART..*/.int 
eb40: 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
eb50: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
eb60: 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64  nt iDb, int eMod
eb70: 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69  e, int *pnLog, i
eb80: 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69  nt *pnCkpt){.  i
eb90: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
eba0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
ebb0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
ebc0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
ebf0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74  erate through at
ec00: 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20  tached dbs */.  
ec10: 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20  int bBusy = 0;  
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54  /* True if SQLIT
ec40: 45 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20  E_BUSY has been 
ec50: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a  encountered */..
ec60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ec70: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
ec80: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
ec90: 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a  ert( !pnLog || *
eca0: 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61  pnLog==-1 );.  a
ecb0: 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c  ssert( !pnCkpt |
ecc0: 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b  | *pnCkpt==-1 );
ecd0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
ece0: 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51  b->nDb && rc==SQ
ecf0: 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
ed00: 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c     if( i==iDb ||
ed10: 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58   iDb==SQLITE_MAX
ed20: 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20  _ATTACHED ){.   
ed30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
ed40: 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64  treeCheckpoint(d
ed50: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65  b->aDb[i].pBt, e
ed60: 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
ed70: 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f  kpt);.      pnLo
ed80: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43  g = 0;.      pnC
ed90: 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  kpt = 0;.      i
eda0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
edb0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42  SY ){.        bB
edc0: 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  usy = 1;.       
edd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ede0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
edf0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
ee00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
ee10: 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42  Busy) ? SQLITE_B
ee20: 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64  USY : rc;.}.#end
ee30: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ee40: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
ee50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
ee60: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61  turns true if ma
ee70: 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64  in-memory should
ee80: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
ee90: 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61   of.** a tempora
eea0: 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e  ry file for tran
eeb0: 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65  sient pager file
eec0: 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20  s and statement 
eed0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
eee0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
eef0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
ef00: 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70  alue of db->temp
ef10: 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a  _store (runtime.
ef20: 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e  ** parameter) an
ef30: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69  d the compile ti
ef40: 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49  me value of SQLI
ef50: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54  TE_TEMP_STORE. T
ef60: 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
ef70: 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
ef80: 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
ef90: 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74   between these t
efa0: 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64  wo values.** and
efb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20   this functions 
efc0: 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a  return value..**
efd0: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d  .**   SQLITE_TEM
efe0: 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e  P_STORE     db->
eff0: 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c  temp_store     L
f000: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f  ocation of tempo
f010: 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  rary database.**
f020: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
f030: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
f040: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
f050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
f070: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
f080: 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
f090: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
f0a0: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
f0b0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
f0c0: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
f0e0: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
f0f0: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
f100: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
f120: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
f130: 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   1).**   1      
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
f170: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
f1a0: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
f1b0: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
f1e0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
f1f0: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
f200: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
f210: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
f220: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
f230: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
f240: 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20  **   3          
f250: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
f270: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
f280: 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1).*/.int sqlite
f290: 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f  3TempInMemory(co
f2a0: 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29  nst sqlite3 *db)
f2b0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  {.#if SQLITE_TEM
f2c0: 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74  P_STORE==1.  ret
f2d0: 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
f2e0: 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  tore==2 );.#endi
f2f0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
f300: 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74  P_STORE==2.  ret
f310: 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
f320: 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69  tore!=1 );.#endi
f330: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
f340: 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74  P_STORE==3.  ret
f350: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  urn 1;.#endif.#i
f360: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
f370: 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f  ORE<1 || SQLITE_
f380: 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72  TEMP_STORE>3.  r
f390: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
f3a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f3b0: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e  UTF-8 encoded En
f3c0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
f3d0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
f3e0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
f3f0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
f400: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65   char *sqlite3_e
f410: 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64  rrmsg(sqlite3 *d
f420: 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
f430: 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
f440: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
f450: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
f460: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20  E_NOMEM);.  }.  
f470: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f480: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
f490: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
f4a0: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
f4b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f4c0: 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PT);.  }.  sqlit
f4d0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f4e0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
f4f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f500: 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  d ){.    z = sql
f510: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
f520: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73  E_NOMEM);.  }els
f530: 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e{.    testcase(
f540: 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a   db->pErr==0 );.
f550: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73      z = (char*)s
f560: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f570: 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  t(db->pErr);.   
f580: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
f590: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
f5a0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
f5b0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
f5c0: 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
f5d0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
f5e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f5f0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f600: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
f610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f620: 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
f630: 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63  eturn UTF-16 enc
f640: 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
f650: 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
f660: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
f670: 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
f680: 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
f690: 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73  lite3_errmsg16(s
f6a0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
f6b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
f6c0: 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20  outOfMem[] = {. 
f6d0: 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
f6e0: 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c  , ' ', 'o', 'f',
f6f0: 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20   ' ', 'm', 'e', 
f700: 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27  'm', 'o', 'r', '
f710: 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61  y', 0.  };.  sta
f720: 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69  tic const u16 mi
f730: 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  suse[] = {.    '
f740: 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72  l', 'i', 'b', 'r
f750: 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27  ', 'a', 'r', 'y'
f760: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c  , ' ', .    'r',
f770: 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
f780: 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27  'i', 'n', 'e', '
f790: 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61   ', .    'c', 'a
f7a0: 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27  ', 'l', 'l', 'e'
f7b0: 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'd', ' ', .   
f7c0: 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
f7d0: 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
f7e0: 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73  f', ' ', .    's
f7f0: 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27  ', 'e', 'q', 'u'
f800: 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c  , 'e', 'n', 'c',
f810: 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20   'e', 0.  };..  
f820: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20  const void *z;. 
f830: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
f840: 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f  return (void *)o
f850: 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69  utOfMem;.  }.  i
f860: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f870: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
f880: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
f890: 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b   (void *)misuse;
f8a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
f8b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f8c0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
f8d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f8e0: 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a  .    z = (void *
f8f0: 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c  )outOfMem;.  }el
f900: 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  se{.    z = sqli
f910: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
f920: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
f930: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
f940: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
f950: 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20  b, db->errCode, 
f960: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
f970: 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20  ->errCode));.   
f980: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
f990: 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
f9a0: 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
f9b0: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
f9c0: 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
f9d0: 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
f9e0: 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
f9f0: 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
fa00: 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
fa10: 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
fa20: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
fa30: 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
fa40: 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
fa50: 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
fa60: 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
fa70: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
fa80: 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
fa90: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
faa0: 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
fab0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
fac0: 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
fad0: 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
fae0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
faf0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 0;.  }.  sql
fb00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fb10: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
fb20: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
fb30: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fb40: 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
fb50: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   Return the most
fb60: 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f   recent error co
fb70: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
fb80: 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e  an SQLite routin
fb90: 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a  e. If NULL is.**
fba0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
fbb0: 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73  function, we ass
fbc0: 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  ume a malloc() f
fbd0: 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c  ailed during sql
fbe0: 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a  ite3_open()..*/.
fbf0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63  int sqlite3_errc
fc00: 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
fc10: 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
fc20: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
fc30: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
fc40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fc50: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
fc60: 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
fc70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
fc80: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
fc90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fca0: 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
fcb0: 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72  rrCode & db->err
fcc0: 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Mask;.}.int sqli
fcd0: 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
fce0: 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
fcf0: 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
fd00: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
fd10: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
fd20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fd30: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
fd40: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
fd50: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
fd60: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
fd70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fd80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
fd90: 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errCode;.}../*.*
fda0: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
fdb0: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
fdc0: 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
fdd0: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
fde0: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
fdf0: 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20    For now, this 
fe00: 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65  simply calls the
fe10: 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65   internal sqlite
fe20: 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e  3ErrStr().** fun
fe30: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
fe40: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
fe50: 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rstr(int rc){.  
fe60: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
fe70: 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  rStr(rc);.}../*.
fe80: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c  ** Invalidate al
fe90: 6c 20 63 61 63 68 65 64 20 4b 65 79 49 6e 66 6f  l cached KeyInfo
fea0: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 64 61 74   objects for dat
feb0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
fec0: 20 22 64 62 22 0a 2a 2f 0a 73 74 61 74 69 63 20   "db".*/.static 
fed0: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43  void invalidateC
fee0: 61 63 68 65 64 4b 65 79 49 6e 66 6f 28 73 71 6c  achedKeyInfo(sql
fef0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 44 62 20  ite3 *db){.  Db 
ff00: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
ff10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
ff20: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  ngle database */
ff30: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff50: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
ff60: 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
ff70: 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff90: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
ffa0: 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
ffb0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
ffe0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
fff0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
10000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
10010 61 63 68 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ach index */..  
10020 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
10030 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
10040 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
10050 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  +){.    if( pDb-
10060 3e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  >pBt==0 ) contin
10070 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ue;.    sqlite3B
10080 74 72 65 65 45 6e 74 65 72 28 70 44 62 2d 3e 70  treeEnter(pDb->p
10090 42 74 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  Bt);.    for(k=s
100a0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
100b0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
100c0 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
100d0 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
100e0 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
100f0 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
10100 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
10110 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
10120 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
10130 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
10140 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
10150 2d 3e 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 49  ->pKeyInfo && pI
10160 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  dx->pKeyInfo->db
10170 3d 3d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  ==db ){.        
10180 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
10190 55 6e 72 65 66 28 70 49 64 78 2d 3e 70 4b 65 79  Unref(pIdx->pKey
101a0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
101b0 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20   pIdx->pKeyInfo 
101c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
101d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
101e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
101f0 76 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  ve(pDb->pBt);.  
10200 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
10210 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e  e a new collatin
10220 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  g function for d
10230 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54  atabase "db".  T
10240 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65  he name is zName
10250 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f  .** and the enco
10260 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a  ding is enc..*/.
10270 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
10280 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  eCollation(.  sq
10290 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e  lite3* db,.  con
102a0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
102b0 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69  .  u8 enc,.  voi
102c0 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
102d0 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
102e0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
102f0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
10300 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
10310 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c  void*).){.  Coll
10320 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
10330 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e  t enc2;.  int nN
10340 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
10350 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
10360 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10370 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
10380 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
10390 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
103a0 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
103b0 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
103c0 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
103d0 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
103e0 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
103f0 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
10400 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
10410 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
10420 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
10430 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
10440 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
10450 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20  ..  */.  enc2 = 
10460 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28  enc;.  testcase(
10470 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
10480 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  F16 );.  testcas
10490 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
104a0 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b  UTF16_ALIGNED );
104b0 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c  .  if( enc2==SQL
104c0 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63  ITE_UTF16 || enc
104d0 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
104e0 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65  ALIGNED ){.    e
104f0 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  nc2 = SQLITE_UTF
10500 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20  16NATIVE;.  }.  
10510 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f  if( enc2<SQLITE_
10520 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c  UTF8 || enc2>SQL
10530 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20  ITE_UTF16BE ){. 
10540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10550 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
10560 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
10570 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65   this call is re
10580 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63  moving or replac
10590 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ing an existing 
105a0 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20  collation .  ** 
105b0 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c  sequence. If so,
105c0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
105d0 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72  ctive VMs, retur
105e0 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65  n busy. If there
105f0 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  .  ** are no act
10600 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64  ive VMs, invalid
10610 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70  ate any pre-comp
10620 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
10630 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  */.  pColl = 
10640 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
10650 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
10660 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66   zName, 0);.  if
10670 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c  ( pColl && pColl
10680 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66  ->xCmp ){.    if
10690 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
106a0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
106b0 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
106c0 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
106d0 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
106e0 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
106f0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
10700 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
10710 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
10720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
10730 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
10740 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
10750 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
10760 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
10770 65 43 61 63 68 65 64 4b 65 79 49 6e 66 6f 28 64  eCachedKeyInfo(d
10780 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63  b);..    /* If c
10790 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
107a0 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61  e pColl was crea
107b0 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20  ted directly by 
107c0 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  a call to.    **
107d0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
107e0 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e  collation, and n
107f0 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ot generated by 
10800 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a  synthCollSeq(),.
10810 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20      ** then any 
10820 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73  copies made by s
10830 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65  ynthCollSeq() ne
10840 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ed to be invalid
10850 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  ated..    ** Als
10860 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73  o, collation des
10870 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65  tructor - CollSe
10880 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74  q.xDel() - funct
10890 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ion may need.   
108a0 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64   ** to be called
108b0 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66  ..    */ .    if
108c0 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20  ( (pColl->enc & 
108d0 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  ~SQLITE_UTF16_AL
108e0 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a  IGNED)==enc2 ){.
108f0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61        CollSeq *a
10900 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
10910 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
10920 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  lSeq, zName, nNa
10930 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  me);.      int j
10940 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
10950 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
10960 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
10970 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   &aColl[j];.    
10980 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d      if( p->enc==
10990 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
109a0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78          if( p->x
109b0 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Del ){.         
109c0 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55     p->xDel(p->pU
109d0 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ser);.          
109e0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78  }.          p->x
109f0 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cmp = 0;.       
10a00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10a10 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  }..  pColl = 
10a20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
10a30 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
10a40 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66   zName, 1);.  if
10a50 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74  ( pColl==0 ) ret
10a60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10a70 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  ;.  pColl->xCmp 
10a80 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  = xCompare;.  pC
10a90 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74  oll->pUser = pCt
10aa0 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  x;.  pColl->xDel
10ab0 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c   = xDel;.  pColl
10ac0 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
10ad0 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
10ae0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
10af0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  );.  sqlite3Erro
10b00 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
10b10 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
10b20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
10b30 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65  ** This array de
10b40 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72  fines hard upper
10b50 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74   bounds on limit
10b60 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a   values.  The.**
10b70 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73   initializer mus
10b80 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e  t be kept in syn
10b90 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  c with the SQLIT
10ba0 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65  E_LIMIT_*.** #de
10bb0 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33  fines in sqlite3
10bc0 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  .h..*/.static co
10bd0 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d  nst int aHardLim
10be0 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54  it[] = {.  SQLIT
10bf0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20  E_MAX_LENGTH,.  
10c00 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
10c10 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
10c20 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51  MAX_COLUMN,.  SQ
10c30 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
10c40 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
10c50 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
10c60 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  T,.  SQLITE_MAX_
10c70 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54  VDBE_OP,.  SQLIT
10c80 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
10c90 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  RG,.  SQLITE_MAX
10ca0 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c  _ATTACHED,.  SQL
10cb0 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
10cc0 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  TERN_LENGTH,.  S
10cd0 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
10ce0 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c  LE_NUMBER,.  SQL
10cf0 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
10d00 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  DEPTH,.};../*.**
10d10 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68   Make sure the h
10d20 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73  ard limits are s
10d30 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65  et to reasonable
10d40 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53   values.*/.#if S
10d50 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
10d60 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
10d70 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d  ITE_MAX_LENGTH m
10d80 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
10d90 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
10da0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
10db0 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
10dc0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
10dd0 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
10de0 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
10df0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
10e00 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c  X_SQL_LENGTH>SQL
10e10 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
10e20 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
10e30 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
10e40 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72  t not be greater
10e50 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58   than SQLITE_MAX
10e60 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23  _LENGTH.#endif.#
10e70 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
10e80 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a  MPOUND_SELECT<2.
10e90 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10ea0 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
10eb0 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  CT must be at le
10ec0 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66  ast 2.#endif.#if
10ed0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
10ee0 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53  _OP<40.# error S
10ef0 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
10f00 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  P must be at lea
10f10 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66  st 40.#endif.#if
10f20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
10f30 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51  TION_ARG<0 || SQ
10f40 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
10f50 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72  N_ARG>1000.# err
10f60 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  or SQLITE_MAX_FU
10f70 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20  NCTION_ARG must 
10f80 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
10f90 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66   1000.#endif.#if
10fa0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
10fb0 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45  CHED<0 || SQLITE
10fc0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 36 32  _MAX_ATTACHED>62
10fd0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10fe0 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73  MAX_ATTACHED mus
10ff0 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
11000 6e 64 20 36 32 0a 23 65 6e 64 69 66 0a 23 69 66  nd 62.#endif.#if
11010 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
11020 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c  _PATTERN_LENGTH<
11030 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
11040 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
11050 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  N_LENGTH must be
11060 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
11070 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
11080 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23  X_COLUMN>32767.#
11090 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
110a0 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f  X_COLUMN must no
110b0 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23  t exceed 32767.#
110c0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
110d0 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
110e0 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
110f0 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
11100 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74  DEPTH must be at
11110 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
11120 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11130 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69  he value of a li
11140 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65  mit.  Report the
11150 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49   old value..** I
11160 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d  f an invalid lim
11170 69 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70  it index is supp
11180 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e  lied, report -1.
11190 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
111a0 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65  ges but still re
111b0 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c  port the old val
111c0 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  ue if the.** new
111d0 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
111e0 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  ve..**.** A new 
111f0 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73  lower limit does
11200 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73   not shrink exis
11210 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e  ting constructs.
11220 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72  .** It merely pr
11230 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74  events new const
11240 72 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65  ructs that excee
11250 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66  d the limit.** f
11260 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a  rom forming..*/.
11270 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  int sqlite3_limi
11280 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
11290 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20  nt limitId, int 
112a0 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74  newLimit){.  int
112b0 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f   oldLimit;...  /
112c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
112d0 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72  -30189-54097 For
112e0 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65   each limit cate
112f0 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49  gory SQLITE_LIMI
11300 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72  T_NAME.  ** ther
11310 65 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65  e is a hard uppe
11320 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63  r bound set at c
11330 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61  ompile-time by a
11340 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a   C preprocessor.
11350 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65    ** macro calle
11360 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d  d SQLITE_MAX_NAM
11370 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f  E. (The "_LIMIT_
11380 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73  " in the name is
11390 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a   changed to.  **
113a0 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a   "_MAX_".).  */.
113b0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
113c0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
113d0 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  T_LENGTH]==SQLIT
113e0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a  E_MAX_LENGTH );.
113f0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
11400 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
11410 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53  T_SQL_LENGTH]==S
11420 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
11430 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  NGTH );.  assert
11440 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
11450 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
11460 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  ]==SQLITE_MAX_CO
11470 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  LUMN );.  assert
11480 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
11490 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
114a0 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  EPTH]==SQLITE_MA
114b0 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a  X_EXPR_DEPTH );.
114c0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
114d0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
114e0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
114f0 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43  T]==SQLITE_MAX_C
11500 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b  OMPOUND_SELECT);
11510 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
11520 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
11530 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c  IT_VDBE_OP]==SQL
11540 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
11550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
11560 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11570 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
11580 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46  G]==SQLITE_MAX_F
11590 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20  UNCTION_ARG );. 
115a0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
115b0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
115c0 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49  _ATTACHED]==SQLI
115d0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
115e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
115f0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11600 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
11610 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20  N_LENGTH]==.    
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
11650 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
11660 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  RN_LENGTH );.  a
11670 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
11680 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
11690 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d  ARIABLE_NUMBER]=
116a0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49  =SQLITE_MAX_VARI
116b0 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20  ABLE_NUMBER);.  
116c0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
116d0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
116e0 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d  TRIGGER_DEPTH]==
116f0 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
11700 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  ER_DEPTH );.  as
11710 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d  sert( SQLITE_LIM
11720 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
11730 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  ==(SQLITE_N_LIMI
11740 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20  T-1) );...  if( 
11750 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d  limitId<0 || lim
11760 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c  itId>=SQLITE_N_L
11770 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75  IMIT ){.    retu
11780 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64  rn -1;.  }.  old
11790 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  Limit = db->aLim
117a0 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69  it[limitId];.  i
117b0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29  f( newLimit>=0 )
117c0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
117d0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32      /* IMP: R-52
117e0 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20  476-28732 */.   
117f0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48   if( newLimit>aH
11800 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
11810 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69  ] ){.      newLi
11820 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74  mit = aHardLimit
11830 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49  [limitId];  /* I
11840 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33  MP: R-51463-2563
11850 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64  4 */.    }.    d
11860 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
11870 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  d] = newLimit;. 
11880 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c   }.  return oldL
11890 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
118a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
118b0 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20  : R-53341-35419 
118c0 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  */.}../*.** This
118d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
118e0 64 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20  d to parse both 
118f0 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49  URIs and non-URI
11900 20 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65   filenames passe
11910 64 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72  d by the.** user
11920 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   to API function
11930 73 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  s sqlite3_open()
11940 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e   or sqlite3_open
11950 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64  _v2(), and for d
11960 61 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20  atabase.** URIs 
11970 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72  specified as par
11980 74 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74  t of ATTACH stat
11990 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ements..**.** Th
119a0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
119b0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
119c0 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
119d0 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   the VFS to use 
119e0 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f  (or.** a NULL to
119f0 20 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66   signify the def
11a00 61 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65  ault VFS) if the
11a10 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f   URI does not co
11a20 6e 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78  ntain a "vfs=xxx
11a30 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d  ".** query param
11a40 65 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  eter. The second
11a50 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69   argument contai
11a60 6e 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e  ns the URI (or n
11a70 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29  on-URI filename)
11a80 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e  .** itself. When
11a90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11aa0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46  s called the *pF
11ab0 6c 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68  lags variable sh
11ac0 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
11ad0 74 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67  the default flag
11ae0 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61  s to open the da
11af0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69  tabase handle wi
11b00 74 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74  th. The value st
11b10 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61  ored in.** *pFla
11b20 67 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65  gs may be update
11b30 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
11b40 6e 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69  ng if the URI fi
11b50 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  lename contains 
11b60 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20  .** "cache=xxx" 
11b70 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75  or "mode=xxx" qu
11b80 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  ery parameters..
11b90 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
11ba0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
11bb0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  s returned. In t
11bc0 68 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20  his case *ppVfs 
11bd0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
11be0 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68  to.** the VFS th
11bf0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
11c00 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61  d to open the da
11c10 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a  tabase file. *pz
11c20 46 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a  File is set to.*
11c30 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  * point to a buf
11c40 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
11c50 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
11c60 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20  ile to open. It 
11c70 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
11c80 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
11c90 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
11ca0 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74  ually call sqlit
11cb0 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c  e3_free() to rel
11cc0 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66  ease.** this buf
11cd0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  fer..**.** If an
11ce0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
11cf0 68 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  hen an SQLite er
11d00 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
11d10 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d  rned and *pzErrM
11d20 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74  sg.** may be set
11d30 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
11d40 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
11d50 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
11d60 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d  uage error .** m
11d70 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
11d80 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
11d90 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
11da0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
11db0 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66  ease.** this buf
11dc0 66 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  fer by calling s
11dd0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
11de0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72  /.int sqlite3Par
11df0 73 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63  seUri(.  const c
11e00 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73  har *zDefaultVfs
11e10 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20  ,        /* VFS 
11e20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66  to use if no "vf
11e30 73 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74  s=xxx" query opt
11e40 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
11e50 68 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20  har *zUri,      
11e60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d           /* Nul-
11e70 74 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74  terminated URI t
11e80 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73  o parse */.  uns
11e90 69 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67  igned int *pFlag
11ea0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
11eb0 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f  IN/OUT: SQLITE_O
11ec0 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  PEN_XXX flags */
11ed0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
11ee0 2a 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20  *ppVfs,         
11ef0 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74     /* OUT: VFS t
11f00 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72  o use */ .  char
11f10 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20   **pzFile,      
11f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11f30 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d  UT: Filename com
11f40 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f  ponent of URI */
11f50 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
11f60 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sg              
11f70 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
11f80 20 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21   message (if rc!
11f90 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29  =SQLITE_OK) */.)
11fa0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11fb0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e  ITE_OK;.  unsign
11fc0 65 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a  ed int flags = *
11fd0 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20  pFlags;.  const 
11fe0 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65  char *zVfs = zDe
11ff0 66 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72  faultVfs;.  char
12000 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20   *zFile;.  char 
12010 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  c;.  int nUri = 
12020 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12030 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74  zUri);..  assert
12040 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29  ( *pzErrMsg==0 )
12050 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73  ;..  if( ((flags
12060 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
12070 52 49 29 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  RI) || sqlite3Gl
12080 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e  obalConfig.bOpen
12090 55 72 69 29 20 0a 20 20 20 26 26 20 6e 55 72 69  Uri) .   && nUri
120a0 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55  >=5 && memcmp(zU
120b0 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d  ri, "file:", 5)=
120c0 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  =0 .  ){.    cha
120d0 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74  r *zOpt;.    int
120e0 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
120f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
12100 72 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20  rser state when 
12110 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20  parsing URI */. 
12120 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20     int iIn;     
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63   /* Input charac
12150 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ter index */.   
12160 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20   int iOut = 0;  
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12180 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74  * Output charact
12190 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
121a0 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69  int nByte = nUri
121b0 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +2;           /*
121c0 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
121d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
121e0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
121f0 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
12200 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74  _URI flag is set
12210 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20   to indicate to 
12220 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20  the VFS xOpen . 
12230 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61     ** method tha
12240 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
12250 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20  xtra parameters 
12260 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
12270 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20  le-name.  */.   
12280 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
12290 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20  _OPEN_URI;..    
122a0 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e  for(iIn=0; iIn<n
122b0 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74  Uri; iIn++) nByt
122c0 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d  e += (zUri[iIn]=
122d0 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ='&');.    zFile
122e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
122f0 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  c(nByte);.    if
12300 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
12310 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12320 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69  .    iIn = 5;.#i
12330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c  fndef SQLITE_ALL
12340 4f 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59  OW_URI_AUTHORITY
12350 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
12360 74 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61  the scheme and a
12370 75 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74  uthority segment
12380 73 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f  s of the URI. */
12390 0a 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d  .    if( zUri[5]
123a0 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d  =='/' && zUri[6]
123b0 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
123c0 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68  In = 7;.      wh
123d0 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26  ile( zUri[iIn] &
123e0 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27  & zUri[iIn]!='/'
123f0 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
12400 69 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69  if( iIn!=7 && (i
12410 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70  In!=16 || memcmp
12420 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a  ("localhost", &z
12430 55 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20  Uri[7], 9)) ){. 
12440 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
12450 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
12460 74 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20  tf("invalid uri 
12470 61 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22  authority: %.*s"
12480 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
12490 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b  In-7, &zUri[7]);
124a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
124b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
124c0 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
124d0 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ri_out;.      }.
124e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
124f0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69    /* Copy the fi
12500 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71  lename and any q
12510 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
12520 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62  into the zFile b
12530 75 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44  uffer. .    ** D
12540 65 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65  ecode %HH escape
12550 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65   codes along the
12560 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20   way. .    **.  
12570 20 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73    ** Within this
12580 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20   loop, variable 
12590 65 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65  eState may be se
125a0 74 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20  t to 0, 1 or 2, 
125b0 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a  depending.    **
125c0 20 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20   on the parsing 
125d0 63 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c  context. As foll
125e0 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ows:.    **.    
125f0 2a 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20  **   0: Parsing 
12600 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a  file-name..    *
12610 2a 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e  *   1: Parsing n
12620 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  ame section of a
12630 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
12640 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
12650 20 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67   **   2: Parsing
12660 20 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f   value section o
12670 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
12680 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
12690 20 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74      */.    eStat
126a0 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  e = 0;.    while
126b0 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
126c0 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29  )!=0 && c!='#' )
126d0 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20  {.      iIn++;. 
126e0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20       if( c=='%' 
126f0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
12700 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
12710 69 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26  iIn]) .       &&
12720 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
12730 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20  (zUri[iIn+1]) . 
12740 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12750 69 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c  int octet = (sql
12760 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
12770 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b  i[iIn++]) << 4);
12780 0a 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b  .        octet +
12790 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e  = sqlite3HexToIn
127a0 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a  t(zUri[iIn++]);.
127b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
127c0 20 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74   octet>=0 && oct
127d0 65 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20  et<256 );.      
127e0 20 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29    if( octet==0 )
127f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
12800 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
12810 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61  ken when "%00" a
12820 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68  ppears within th
12830 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20  e URI. In this. 
12840 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
12850 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74   we ignore all t
12860 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ext in the remai
12870 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68  nder of the path
12880 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20  , name or.      
12890 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72      ** value cur
128a0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72  rently being par
128b0 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  sed. So ignore t
128c0 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
128d0 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  cter.          *
128e0 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68  * and skip to th
128f0 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20  e next "?", "=" 
12900 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f  or "&", as appro
12910 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  priate. */.     
12920 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
12930 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
12940 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20  & c!='#' .      
12950 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
12960 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29  te!=0 || c!='?')
12970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
12980 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20  & (eState!=1 || 
12990 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26  (c!='=' && c!='&
129a0 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')).            
129b0 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20    && (eState!=2 
129c0 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20  || c!='&').     
129d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
129e0 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
129f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12a00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12a10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
12a20 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65   octet;.      }e
12a30 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d  lse if( eState==
12a40 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20  1 && (c=='&' || 
12a50 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  c=='=') ){.     
12a60 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75     if( zFile[iOu
12a70 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1]==0 ){.     
12a80 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79       /* An empty
12a90 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67   option name. Ig
12aa0 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
12ab0 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a   altogether. */.
12ac0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
12ad0 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
12ae0 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20  ri[iIn]!='#' && 
12af0 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27  zUri[iIn-1]!='&'
12b00 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
12b10 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
12b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12b30 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20  if( c=='&' ){.  
12b40 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f          zFile[iO
12b50 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
12b60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12b70 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
12b80 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
12b90 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
12ba0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74    }else if( (eSt
12bb0 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27  ate==0 && c=='?'
12bc0 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20  ) || (eState==2 
12bd0 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20  && c=='&') ){.  
12be0 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
12bf0 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b       eState = 1;
12c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
12c10 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63  File[iOut++] = c
12c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12c30 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c  eState==1 ) zFil
12c40 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
12c50 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
12c60 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
12c70 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
12c80 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  '\0';..    /* Ch
12c90 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72  eck if there wer
12ca0 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70  e any options sp
12cb0 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f  ecified that sho
12cc0 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74  uld be interpret
12cd0 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e  ed .    ** here.
12ce0 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72   Options that ar
12cf0 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65  e interpreted he
12d00 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22  re include "vfs"
12d10 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a   and those that.
12d20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
12d30 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20  d to flags that 
12d40 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f  may be passed to
12d50 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65   the sqlite3_ope
12d60 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65  n_v2().    ** me
12d70 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70  thod. */.    zOp
12d80 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74  t = &zFile[sqlit
12d90 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
12da0 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
12db0 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20   zOpt[0] ){.    
12dc0 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c    int nOpt = sql
12dd0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
12de0 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t);.      char *
12df0 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70  zVal = &zOpt[nOp
12e00 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  t+1];.      int 
12e10 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nVal = sqlite3St
12e20 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20  rlen30(zVal);.. 
12e30 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33       if( nOpt==3
12e40 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22   && memcmp("vfs"
12e50 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b  , zOpt, 3)==0 ){
12e60 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20  .        zVfs = 
12e70 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  zVal;.      }els
12e80 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
12e90 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20  t OpenMode {.   
12ea0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
12eb0 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  r *z;.          
12ec0 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  int mode;.      
12ed0 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a    } *aMode = 0;.
12ee0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
12ef0 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20  odeType = 0;.   
12f00 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
12f10 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
12f20 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  imit = 0;..     
12f30 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26     if( nOpt==5 &
12f40 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22  & memcmp("cache"
12f50 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b  , zOpt, 5)==0 ){
12f60 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
12f70 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
12f80 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d  e aCacheMode[] =
12f90 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
12fa0 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49   "shared",  SQLI
12fb0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
12fc0 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
12fd0 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20     { "private", 
12fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
12ff0 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
13000 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
13010 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
13020 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
13030 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
13040 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f  EDCACHE|SQLITE_O
13050 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
13060 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
13070 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a  e = aCacheMode;.
13080 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
13090 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  = mask;.        
130a0 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63    zModeType = "c
130b0 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d  ache";.        }
130c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
130d0 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==4 && memcmp("
130e0 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d  mode", zOpt, 4)=
130f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13100 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
13110 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65  enMode aOpenMode
13120 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
13130 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49     { "ro",  SQLI
13140 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
13150 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
13160 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f  { "rw",  SQLITE_
13170 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d  OPEN_READWRITE }
13180 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  , .            {
13190 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f   "rwc", SQLITE_O
131a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
131b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
131c0 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  TE },.          
131d0 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51    { "memory", SQ
131e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
131f0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
13200 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
13210 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
13220 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
13230 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53  PEN_READONLY | S
13240 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
13250 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
13260 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
13270 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
13280 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
13290 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  Y;.          aMo
132a0 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a  de = aOpenMode;.
132b0 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
132c0 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a  = mask & flags;.
132d0 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
132e0 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a  ype = "access";.
132f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
13300 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a     if( aMode ){.
13310 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
13320 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
13330 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
13340 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64     for(i=0; aMod
13350 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20  e[i].z; i++){.  
13360 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
13370 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b  char *z = aMode[
13380 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  i].z;.          
13390 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69    if( nVal==sqli
133a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26  te3Strlen30(z) &
133b0 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c  & 0==memcmp(zVal
133c0 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20  , z, nVal) ){.  
133d0 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
133e0 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65   = aMode[i].mode
133f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13400 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
13410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
13420 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
13430 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
13440 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
13450 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
13460 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f  f("no such %s mo
13470 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79  de: %s", zModeTy
13480 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
13490 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
134a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
134b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
134c0 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
134d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
134e0 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c  if( (mode & ~SQL
134f0 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
13500 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
13510 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
13520 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
13530 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61  f("%s mode not a
13540 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20  llowed: %s",.   
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13570 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20       zModeType, 
13580 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
13590 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
135a0 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERM;.           
135b0 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
135c0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
135d0 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
135e0 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73   = (flags & ~mas
135f0 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20  k) | mode;.     
13600 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
13610 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c      zOpt = &zVal
13620 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a  [nVal+1];.    }.
13630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46  .  }else{.    zF
13640 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
13650 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20  lloc(nUri+2);.  
13660 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
13670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13680 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  EM;.    memcpy(z
13690 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69  File, zUri, nUri
136a0 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  );.    zFile[nUr
136b0 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  i] = '\0';.    z
136c0 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27  File[nUri+1] = '
136d0 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26  \0';.    flags &
136e0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  = ~SQLITE_OPEN_U
136f0 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66  RI;.  }..  *ppVf
13700 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
13710 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66  find(zVfs);.  if
13720 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20  ( *ppVfs==0 ){. 
13730 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
13740 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13750 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22  no such vfs: %s"
13760 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20  , zVfs);.    rc 
13770 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
13780 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f    }. parse_uri_o
13790 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
137a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
137b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
137c0 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  e);.    zFile = 
137d0 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73  0;.  }.  *pFlags
137e0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46   = flags;.  *pzF
137f0 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72  ile = zFile;.  r
13800 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
13810 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13820 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
13830 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
13840 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
13850 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
13860 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
13870 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
13880 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
13890 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
138a0 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
138b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
138c0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
138d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
138e0 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
138f0 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
13900 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
13910 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
13920 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
13930 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
13940 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
13950 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c  igned int flags,
13960 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
13970 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
13980 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
13990 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
139a0 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
139b0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
139c0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
139d0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
139e0 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65  allocated handle
139f0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
13a00 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
13a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13a20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
13a30 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a50 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61  * True for threa
13a60 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  dsafe connection
13a70 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70  s */.  char *zOp
13a80 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
13a90 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
13aa0 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  me argument to p
13ab0 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  ass to BtreeOpen
13ac0 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  () */.  char *zE
13ad0 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
13ae0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
13af0 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71   message from sq
13b00 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20  lite3ParseUri() 
13b10 2a 2f 0a 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  */..  *ppDb = 0;
13b20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13b30 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
13b40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
13b50 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
13b60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13b70 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e  .#endif..  /* On
13b80 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c  ly allow sensibl
13b90 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  e combinations o
13ba0 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c  f bits in the fl
13bb0 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  ags argument.  .
13bc0 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72    ** Throw an er
13bd0 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73  ror if any non-s
13be0 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ense combination
13bf0 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65   is used.  If we
13c00 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f  .  ** do not blo
13c10 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69  ck illegal combi
13c20 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74  nations here, it
13c30 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20   could trigger. 
13c40 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61   ** assert() sta
13c50 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65  tements in deepe
13c60 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69  r layers.  Sensi
13c70 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
13c80 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a  .  ** are:.  **.
13c90 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45    **  1:  SQLITE
13ca0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20  _OPEN_READONLY. 
13cb0 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f   **  2:  SQLITE_
13cc0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
13cd0 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f   **  6:  SQLITE_
13ce0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
13cf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
13d00 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ATE.  */.  asser
13d10 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
13d20 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31  EADONLY  == 0x01
13d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
13d40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13d50 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20  ITE == 0x02 );. 
13d60 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
13d70 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d  OPEN_CREATE    =
13d80 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74  = 0x04 );.  test
13d90 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
13da0 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a  &7))==0x02 ); /*
13db0 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74   READONLY */.  t
13dc0 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
13dd0 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b  ags&7))==0x04 );
13de0 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f   /* READWRITE */
13df0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
13e00 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34  <(flags&7))==0x4
13e10 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  0 ); /* READWRIT
13e20 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20  E | CREATE */.  
13e30 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26  if( ((1<<(flags&
13e40 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29  7)) & 0x46)==0 )
13e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
13e60 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69  ISUSE_BKPT;..  i
13e70 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
13e80 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
13e90 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68  x==0 ){.    isTh
13ea0 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
13eb0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
13ec0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  & SQLITE_OPEN_NO
13ed0 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
13ee0 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
13ef0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
13f00 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   & SQLITE_OPEN_F
13f10 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  ULLMUTEX ){.    
13f20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31  isThreadsafe = 1
13f30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
13f40 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71  sThreadsafe = sq
13f50 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
13f60 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20  g.bFullMutex;.  
13f70 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  }.  if( flags & 
13f80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
13f90 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20  ATECACHE ){.    
13fa0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
13fb0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
13fc0 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  E;.  }else if( s
13fd0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
13fe0 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
13ff0 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61  abled ){.    fla
14000 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
14010 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
14020 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
14030 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
14040 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
14050 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
14060 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
14070 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
14080 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
14090 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
140a0 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
140b0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
140c0 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
140d0 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
140e0 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
140f0 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
14100 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
14110 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
14120 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
14130 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
14140 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ITE, SQLITE_OPEN
14150 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f  _CREATE, SQLITE_
14160 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
14170 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
14180 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c  EN_PRIVATECACHE,
14190 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76   and some reserv
141a0 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74  ed bits.  Silent
141b0 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66  ly mask.  ** off
141c0 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
141d0 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26  ..  */.  flags &
141e0 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45  =  ~( SQLITE_OPE
141f0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
14200 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
14210 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
14220 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
14230 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
14240 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20  PEN_MAIN_DB |.  
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14260 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
14270 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
14280 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
14290 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20  RANSIENT_DB | . 
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
142b0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
142c0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
142d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
142e0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
142f0 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
14300 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
14310 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  SUBJOURNAL | .  
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14330 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
14340 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20  JOURNAL |.      
14350 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14360 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20  OPEN_NOMUTEX |. 
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14380 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
14390 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
143a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
143b0 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  _WAL.           
143c0 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    );..  /* Alloc
143d0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
143e0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
143f0 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d  .  db = sqlite3M
14400 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
14410 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20  f(sqlite3) );.  
14420 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f  if( db==0 ) goto
14430 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69   opendb_out;.  i
14440 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20  f( isThreadsafe 
14450 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78  ){.    db->mutex
14460 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
14470 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
14480 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
14490 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d    if( db->mutex=
144a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
144b0 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20  te3_free(db);.  
144c0 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20      db = 0;.    
144d0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
144e0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
144f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14500 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
14510 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30   db->errMask = 0
14520 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  xff;.  db->nDb =
14530 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   2;.  db->magic 
14540 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
14550 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d  USY;.  db->aDb =
14560 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
14570 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
14580 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73  f(db->aLimit)==s
14590 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74  izeof(aHardLimit
145a0 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62  ) );.  memcpy(db
145b0 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c  ->aLimit, aHardL
145c0 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d  imit, sizeof(db-
145d0 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d  >aLimit));.  db-
145e0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
145f0 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76  .  db->nextAutov
14600 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73  ac = -1;.  db->s
14610 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47  zMmap = sqlite3G
14620 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
14630 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61  ap;.  db->nextPa
14640 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62  gesize = 0;.  db
14650 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
14660 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20  E_ShortColNames 
14670 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
14680 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f  rigger | SQLITE_
14690 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21  CacheSpill.#if !
146a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
146b0 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
146c0 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54  _INDEX) || SQLIT
146d0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
146e0 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20  TIC_INDEX.      
146f0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
14700 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65  ITE_AutoIndex.#e
14710 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
14720 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
14730 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
14740 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
14750 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
14760 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
14770 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
14780 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
14790 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
147a0 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
147b0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
147c0 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
147d0 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
147f0 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
14800 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
14810 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14820 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
14830 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
14840 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
14850 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
14860 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
14870 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
14880 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65        ;.  sqlite
14890 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
148a0 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
148b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
148c0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
148d0 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
148e0 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
148f0 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
14900 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
14910 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
14920 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
14930 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
14940 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
14950 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
14960 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
14970 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
14980 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
14990 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
149a0 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
149b0 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
149c0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
149d0 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
149e0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
149f0 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
14a00 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
14a10 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
14a20 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
14a30 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
14a40 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16BE, 0, binColl
14a50 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
14a60 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
14a70 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
14a80 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e  _UTF16LE, 0, bin
14a90 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
14aa0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
14ab0 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
14ac0 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
14ad0 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
14ae0 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
14af0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14b00 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
14b10 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44  ut;.  }.  db->pD
14b20 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
14b30 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
14b40 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42   SQLITE_UTF8, "B
14b50 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73  INARY", 0);.  as
14b60 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43  sert( db->pDfltC
14b70 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  oll!=0 );..  /* 
14b80 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38  Also add a UTF-8
14b90 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76   case-insensitiv
14ba0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
14bb0 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74  ence. */.  creat
14bc0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
14bd0 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
14be0 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
14bf0 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
14c00 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
14c10 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61  e filename/URI a
14c20 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62  rgument. */.  db
14c30 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
14c40 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ags;.  rc = sqli
14c50 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73  te3ParseUri(zVfs
14c60 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c  , zFilename, &fl
14c70 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20  ags, &db->pVfs, 
14c80 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67  &zOpen, &zErrMsg
14c90 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
14cb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
14cc0 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EM ) db->mallocF
14cd0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73  ailed = 1;.    s
14ce0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
14cf0 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25  rc, zErrMsg ? "%
14d00 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29  s" : 0, zErrMsg)
14d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14d20 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
14d30 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14d40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
14d50 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74   the backend dat
14d60 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a  abase driver */.
14d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14d80 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
14d90 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62  , zOpen, db, &db
14da0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
14db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14dc0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
14dd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
14de0 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
14df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14e00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14e10 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
14e20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14e30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
14e40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
14e50 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20  db, rc, 0);.    
14e60 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
14e70 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30  .  }.  db->aDb[0
14e80 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
14e90 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
14ea0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29   db->aDb[0].pBt)
14eb0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ;.  db->aDb[1].p
14ec0 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
14ed0 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29  SchemaGet(db, 0)
14ee0 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  ;...  /* The def
14ef0 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65  ault safety_leve
14f00 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  l for the main d
14f10 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c  atabase is 'full
14f20 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a  '; for the temp.
14f30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74    ** database it
14f40 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73   is 'NONE'. This
14f50 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67   matches the pag
14f60 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74  er layer default
14f70 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  s.  .  */.  db->
14f80 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22  aDb[0].zName = "
14f90 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62  main";.  db->aDb
14fa0 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [0].safety_level
14fb0 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b   = 3;.  db->aDb[
14fc0 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70  1].zName = "temp
14fd0 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ";.  db->aDb[1].
14fe0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31  safety_level = 1
14ff0 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
15000 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
15010 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
15020 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
15030 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
15040 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
15050 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
15060 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
15070 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
15080 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
15090 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
150a0 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
150b0 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
150c0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
150d0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
150e0 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
150f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
15100 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
15110 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  ;.  sqlite3Regis
15120 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
15130 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ons(db);..  /* L
15140 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78  oad automatic ex
15150 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e  tensions - exten
15160 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  sions that have 
15170 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a  been registered.
15180 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73    ** using the s
15190 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63  qlite3_automatic
151a0 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49  _extension() API
151b0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
151c0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
151d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
151e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
151f0 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74  lite3AutoLoadExt
15200 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20  ensions(db);.   
15210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
15220 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69  rcode(db);.    i
15230 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15240 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   ){.      goto o
15250 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
15260 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
15270 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
15280 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
15290 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
152a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
152b0 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
152c0 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
152d0 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
152e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
152f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15300 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
15310 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15320 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
15330 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
15340 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
15350 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
15360 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
15370 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
15380 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
15390 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
153a0 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S3.  if( !db->ma
153b0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
153c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
153d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
153e0 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
153f0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
15400 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
15410 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
15420 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
15430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
15450 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
15460 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
15470 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
15480 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
15490 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
154a0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
154b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
154c0 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
154d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53  #endif..  /* -DS
154e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
154f0 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
15500 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
15510 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
15520 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
15530 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
15540 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
15550 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
15560 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
15570 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
15580 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
15590 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
155a0 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
155b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
155c0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
155d0 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
155e0 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
155f0 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
15600 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
15610 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
15620 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
15630 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
15640 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
15660 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
15670 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
15680 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73  if..  if( rc ) s
15690 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
156a0 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 45 6e  rc, 0);..  /* En
156b0 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69  able the lookasi
156c0 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  de-malloc subsys
156d0 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f  tem */.  setupLo
156e0 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73  okaside(db, 0, s
156f0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15700 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a  ig.szLookaside,.
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
15730 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f  lobalConfig.nLoo
15740 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69  kaside);..  sqli
15750 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
15760 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54  kpoint(db, SQLIT
15770 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55  E_DEFAULT_WAL_AU
15780 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a  TOCHECKPOINT);..
15790 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71  opendb_out:.  sq
157a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e  lite3_free(zOpen
157b0 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  );.  if( db ){. 
157c0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
157d0 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72  utex!=0 || isThr
157e0 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71  eadsafe==0 || sq
157f0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15800 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20  g.bFullMutex==0 
15810 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
15820 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
15830 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20  utex);.  }.  rc 
15840 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
15850 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28  e(db);.  assert(
15860 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51   db!=0 || rc==SQ
15870 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
15880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
15890 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69  OMEM ){.    sqli
158a0 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
158b0 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c     db = 0;.  }el
158c0 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
158d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  E_OK ){.    db->
158e0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
158f0 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20  AGIC_SICK;.  }. 
15900 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66   *ppDb = db;.#if
15910 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15920 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
15930 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15940 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
15950 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64    /* Opening a d
15960 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  b handle. Fourth
15970 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
15980 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76  ssed 0. */.    v
15990 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69  oid *pArg = sqli
159a0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
159b0 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20  pSqllogArg;.    
159c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
159d0 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67  fig.xSqllog(pArg
159e0 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , db, zFilename,
159f0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
15a00 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
15a10 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
15a20 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
15a30 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
15a40 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
15a50 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
15a60 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
15a70 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
15a80 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
15a90 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
15aa0 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
15ad0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
15ae0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
15af0 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
15b00 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
15b10 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
15b20 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
15b30 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
15b40 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
15b50 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
15b60 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
15b70 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
15b80 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
15b90 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
15ba0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
15bb0 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
15bc0 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
15bd0 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
15be0 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
15bf0 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
15c00 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
15c10 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
15c20 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
15c30 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
15c40 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
15c50 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
15c60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
15c70 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
15c80 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
15c90 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
15ca0 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
15cb0 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
15cc0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
15cd0 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
15ce0 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
15cf0 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
15d00 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
15d10 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15d20 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   zFilename );.  
15d30 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a  assert( ppDb );.
15d40 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
15d50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15d60 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
15d70 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
15d80 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
15d90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
15da0 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  dif.  pVal = sql
15db0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
15dc0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
15dd0 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
15de0 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
15df0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
15e00 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
15e10 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
15e20 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
15e30 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
15e40 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
15e50 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
15e60 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
15e70 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
15ea0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
15eb0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
15ec0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
15ed0 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
15ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
15ef0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15f00 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
15f10 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
15f20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
15f30 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70   ){.      ENC(*p
15f40 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
15f50 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
15f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
15f70 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
15f80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
15f90 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
15fa0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
15fb0 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
15fc0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15fd0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
15fe0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
15ff0 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
16000 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
16010 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
16020 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
16030 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
16040 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
16050 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
16060 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
16070 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
16080 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
16090 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
160a0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
160b0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
160c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
160d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
160e0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
160f0 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
16100 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
16110 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
16120 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
16130 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
16140 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72  Compare, 0);.  r
16150 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
16160 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
16170 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
16180 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
16190 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
161a0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
161b0 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
161c0 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
161d0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
161e0 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
161f0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
16200 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
16210 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
16220 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
16230 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
16240 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
16250 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
16260 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
16270 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
16280 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
16290 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
162a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
162b0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
162c0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
162d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
162e0 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
162f0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
16300 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
16310 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
16320 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
16330 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
16340 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
16350 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
16360 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
16370 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
16380 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
16390 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
163a0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
163b0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
163c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
163d0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
163e0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
163f0 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
16400 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
16410 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
16420 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
16430 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
16440 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
16450 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
16460 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
16470 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16480 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
16490 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65  zName8;.  sqlite
164a0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
164b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
164c0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
164d0 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
164e0 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
164f0 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
16500 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
16510 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e  ATIVE);.  if( zN
16520 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
16530 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
16540 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38  (db, zName8, (u8
16550 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
16560 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
16570 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16580 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
16590 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
165a0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
165b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
165c0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
165d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
165e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
165f0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
16600 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
16610 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
16620 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
16630 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
16640 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
16650 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
16660 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
16670 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
16680 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
16690 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
166a0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
166b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
166c0 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
166d0 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
166e0 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
166f0 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
16700 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
16710 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  char*).){.  sqli
16720 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16730 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
16740 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
16750 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64  xCollNeeded;.  d
16760 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
16770 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c   = 0;.  db->pCol
16780 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
16790 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
167a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
167b0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
167c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
167d0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
167e0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
167f0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
16800 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16810 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
16820 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
16830 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
16840 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
16850 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
16860 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
16870 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
16880 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16890 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
168a0 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  d16(.  sqlite3 *
168b0 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
168c0 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
168d0 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
168e0 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  d16)(void*,sqlit
168f0 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
16900 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
16910 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16920 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
16930 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
16940 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
16950 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
16960 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
16970 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
16980 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
16990 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
169a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
169b0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
169c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
169d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
169e0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
169f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16a00 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
16a10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
16a20 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
16a30 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
16a40 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
16a50 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
16a60 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
16a70 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
16a80 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
16a90 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
16aa0 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
16ab0 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
16ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ad0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
16ae0 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
16af0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
16b00 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
16b10 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
16b20 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
16b30 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
16b40 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
16b50 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
16b60 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
16b70 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
16b80 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
16b90 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
16ba0 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
16bb0 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
16bc0 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
16bd0 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69  r ROLLBACK..*/.i
16be0 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
16bf0 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
16c00 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
16c10 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b   db->autoCommit;
16c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
16c30 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
16c40 20 61 72 65 20 73 75 62 74 69 74 75 74 65 73 20   are subtitutes 
16c50 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51  for constants SQ
16c60 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a  LITE_CORRUPT,.**
16c70 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20   SQLITE_MISUSE, 
16c80 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
16c90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e   SQLITE_IOERR an
16ca0 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72  d possibly other
16cb0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61   error.** consta
16cc0 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65  nts.  They serve
16cd0 72 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a  r two purposes:.
16ce0 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76  **.**   1.  Serv
16cf0 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  e as a convenien
16d00 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
16d10 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61   breakpoint in a
16d20 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20   debugger.**    
16d30 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65     to detect whe
16d40 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20  n version error 
16d50 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72  conditions occur
16d60 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49  s..**.**   2.  I
16d70 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f  nvoke sqlite3_lo
16d80 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74  g() to provide t
16d90 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c  he source code l
16da0 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  ocation where.**
16db0 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76         a low-lev
16dc0 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73  el error is firs
16dd0 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69  t detected..*/.i
16de0 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
16df0 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  tError(int linen
16e00 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
16e10 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16e20 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
16e30 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
16e40 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20  ITE_CORRUPT,.   
16e50 20 20 20 20 20 20 20 20 20 20 20 22 64 61 74 61             "data
16e60 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
16e70 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
16e80 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
16e90 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
16ea0 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
16eb0 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
16ec0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d  QLITE_CORRUPT;.}
16ed0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75  .int sqlite3Misu
16ee0 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  seError(int line
16ef0 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
16f00 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
16f10 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
16f20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
16f30 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20  LITE_MISUSE, .  
16f40 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 69 73              "mis
16f50 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f  use at line %d o
16f60 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20  f [%.10s]",.    
16f70 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f            lineno
16f80 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75  , 20+sqlite3_sou
16f90 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75  rceid());.  retu
16fa0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
16fb0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ;.}.int sqlite3C
16fc0 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74  antopenError(int
16fd0 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
16fe0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
16ff0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
17000 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
17010 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  og(SQLITE_CANTOP
17020 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  EN, .           
17030 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20     "cannot open 
17040 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20  file at line %d 
17050 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
17060 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
17070 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
17080 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
17090 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
170a0 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  PEN;.}...#ifndef
170b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
170c0 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
170d0 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65  is is a convenie
170e0 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74  nce routine that
170f0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
17100 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63   all thread-spec
17110 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72  ific.** data for
17120 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73   this thread has
17130 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   been deallocate
17140 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  d..**.** SQLite 
17150 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74  no longer uses t
17160 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64  hread-specific d
17170 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ata so this rout
17180 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20  ine is now a.** 
17190 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65  no-op.  It is re
171a0 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f  tained for histo
171b0 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c  rical compatibil
171c0 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
171d0 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
171e0 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e  nup(void){.}.#en
171f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
17200 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  n meta informati
17210 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69  on about a speci
17220 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  fic column of a 
17230 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
17240 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69  ** See comment i
17250 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c  n sqlite3.h (sql
17260 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65  ite.h.in) for de
17270 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  tails..*/.#ifdef
17280 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
17290 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69  OLUMN_METADATA.i
172a0 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  nt sqlite3_table
172b0 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
172c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  /* Connection ha
172f0 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
17300 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20  char *zDbName,  
17310 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
17320 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a  e name or NULL *
17330 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
17340 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  zTableName,     
17350 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
17360 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17370 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f  ColumnName,    /
17380 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
17390 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
173a0 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f  pzDataType,    /
173b0 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72  * OUTPUT: Declar
173c0 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a  ed data type */.
173d0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
173e0 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a  zCollSeq,     /*
173f0 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69   OUTPUT: Collati
17400 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
17410 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e   */.  int *pNotN
17420 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
17430 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
17440 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  e if NOT NULL co
17450 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20  nstraint exists 
17460 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61  */.  int *pPrima
17470 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ryKey,          
17480 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
17490 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20   if column part 
174a0 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  of PK */.  int *
174b0 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20  pAutoinc        
174c0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
174d0 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
174e0 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65   is auto-increme
174f0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
17500 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
17510 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  sg = 0;.  Table 
17520 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c  *pTab = 0;.  Col
17530 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20  umn *pCol = 0;. 
17540 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68   int iCol;..  ch
17550 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
17560 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
17570 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
17580 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
17590 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
175a0 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
175b0 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
175c0 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68  ..  /* Ensure th
175d0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
175e0 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65  a has been loade
175f0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  d */.  sqlite3_m
17600 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
17610 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
17620 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
17630 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17640 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
17650 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
17660 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
17670 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
17680 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
17690 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
176a0 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
176b0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
176c0 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
176d0 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
176e0 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
176f0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
17700 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
17710 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
17720 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
17730 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
17740 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
17750 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73  ested */.  if( s
17760 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
17770 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
17780 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
17790 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43  PKey;.    if( iC
177a0 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
177b0 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
177c0 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20  l[iCol];.    }. 
177d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
177e0 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
177f0 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
17800 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
17810 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
17820 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
17830 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
17840 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
17850 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
17860 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17870 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17880 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
17890 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
178a0 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   0;.      goto e
178b0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
178c0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
178d0 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
178e0 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
178f0 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
17900 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
17910 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
17920 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
17930 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
17940 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
17950 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
17960 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
17970 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
17980 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
17990 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
179a0 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
179b0 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
179c0 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
179d0 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
179e0 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
179f0 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
17a00 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
17a10 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
17a20 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
17a30 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
17a40 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
17a50 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
17a60 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
17a70 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
17a80 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
17a90 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
17aa0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
17ab0 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
17ac0 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
17ad0 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70     zDataType = p
17ae0 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
17af0 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
17b00 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
17b10 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  ull = pCol->notN
17b20 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d  ull!=0;.    prim
17b30 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d  arykey  = (pCol-
17b40 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  >colFlags & COLF
17b50 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b  LAG_PRIMKEY)!=0;
17b60 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70  .    autoinc = p
17b70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c  Tab->iPKey==iCol
17b80 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
17b90 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
17ba0 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65  rement)!=0;.  }e
17bb0 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  lse{.    zDataTy
17bc0 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
17bd0 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d      primarykey =
17be0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a   1;.  }.  if( !z
17bf0 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a  CollSeq ){.    z
17c00 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52  CollSeq = "BINAR
17c10 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f  Y";.  }..error_o
17c20 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ut:.  sqlite3Btr
17c30 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
17c40 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68  .  /* Whether th
17c50 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
17c60 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69  succeeded or fai
17c70 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74  led, set the out
17c80 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20  put parameters. 
17c90 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20   ** to whatever 
17ca0 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e  their local coun
17cb0 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e  terparts contain
17cc0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69  . If an error di
17cd0 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68  d occur,.  ** th
17ce0 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63  is has the effec
17cf0 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c  t of zeroing all
17d00 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
17d10 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
17d20 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44  zDataType ) *pzD
17d30 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54  ataType = zDataT
17d40 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c  ype;.  if( pzCol
17d50 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65  lSeq ) *pzCollSe
17d60 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20  q = zCollSeq;.  
17d70 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a  if( pNotNull ) *
17d80 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75  pNotNull = notnu
17d90 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61  ll;.  if( pPrima
17da0 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72  ryKey ) *pPrimar
17db0 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65  yKey = primaryke
17dc0 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e  y;.  if( pAutoin
17dd0 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20  c ) *pAutoinc = 
17de0 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20  autoinc;..  if( 
17df0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26  SQLITE_OK==rc &&
17e00 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71   !pTab ){.    sq
17e10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17e20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45  zErrMsg);.    zE
17e30 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  rrMsg = sqlite3M
17e40 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73  Printf(db, "no s
17e50 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  uch table column
17e60 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65  : %s.%s", zTable
17e70 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43  Name,.        zC
17e80 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  olumnName);.    
17e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
17ea0 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
17eb0 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a  Error(db, rc, (z
17ec0 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20  ErrMsg?"%s":0), 
17ed0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
17ee0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
17ef0 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73  rrMsg);.  rc = s
17f00 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
17f10 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
17f20 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
17f30 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
17f40 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
17f50 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
17f60 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
17f70 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
17f80 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
17f90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17fa0 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  _sleep(int ms){.
17fb0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
17fc0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Vfs;.  int rc;. 
17fd0 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f   pVfs = sqlite3_
17fe0 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
17ff0 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74  f( pVfs==0 ) ret
18000 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  urn 0;..  /* Thi
18010 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
18020 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   in milliseconds
18030 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c  , but the underl
18040 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a  ying OsSleep() .
18050 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69    ** API uses mi
18060 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63  croseconds. Henc
18070 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20  e the 1000's..  
18080 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74  */.  rc = (sqlit
18090 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20  e3OsSleep(pVfs, 
180a0 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a  1000*ms)/1000);.
180b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
180c0 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
180d0 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65  disable the exte
180e0 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65  nded result code
180f0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
18100 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
18110 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20  t_codes(sqlite3 
18120 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b  *db, int onoff){
18130 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18140 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
18150 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
18160 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66   = onoff ? 0xfff
18170 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20  fffff : 0xff;.  
18180 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
18190 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
181a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
181b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  OK;.}../*.** Inv
181c0 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e  oke the xFileCon
181d0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61  trol method on a
181e0 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
181f0 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
18200 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
18210 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  l(sqlite3 *db, c
18220 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
18230 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  me, int op, void
18240 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
18250 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
18260 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  ;.  Btree *pBtre
18270 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
18280 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
18290 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d  tex);.  pBtree =
182a0 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
182b0 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
182c0 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  e);.  if( pBtree
182d0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
182e0 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
182f0 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20  e3_file *fd;.   
18300 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18310 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
18320 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
18330 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65  BtreePager(pBtre
18340 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
18350 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20  pPager!=0 );.   
18360 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67   fd = sqlite3Pag
18370 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
18380 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d      assert( fd!=
18390 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  0 );.    if( op=
183a0 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49  =SQLITE_FCNTL_FI
183b0 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  LE_POINTER ){.  
183c0 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69      *(sqlite3_fi
183d0 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a  le**)pArg = fd;.
183e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
183f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
18400 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  if( fd->pMethods
18410 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
18420 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
18430 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
18440 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18450 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18460 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a  NOTFOUND;.    }.
18470 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18480 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
18490 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
184a0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
184b0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
184c0 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ;   .}../*.** In
184d0 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
184e0 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
184f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
18500 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
18510 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
18520 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
18530 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
18540 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74  N_TEST.  va_list
18550 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
18560 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
18570 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  h( op ){..    /*
18580 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65  .    ** Save the
18590 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
185a0 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20  f the PRNG..    
185b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
185c0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
185d0 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  _SAVE: {.      s
185e0 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74  qlite3PrngSaveSt
185f0 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
18600 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
18610 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65  *.    ** Restore
18620 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
18630 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61  e PRNG to the la
18640 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75  st state saved u
18650 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47  sing.    ** PRNG
18660 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f  _SAVE.  If PRNG_
18670 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62  SAVE has never b
18680 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65  efore been calle
18690 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  d, then.    ** t
186a0 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69  his verb acts li
186b0 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20  ke PRNG_RESET.. 
186c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
186d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
186e0 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20  RNG_RESTORE: {. 
186f0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
18700 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a  RestoreState();.
18710 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18720 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
18730 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47  * Reset the PRNG
18740 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69   back to its uni
18750 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
18760 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c  .  The next call
18770 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
18780 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20  e3_randomness() 
18790 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20  will reseed the 
187a0 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e  PRNG using a sin
187b0 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  gle call.    ** 
187c0 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65  to the xRandomne
187d0 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ss method of the
187e0 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20   default VFS..  
187f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
18800 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
18810 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20  NG_RESET: {.    
18820 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
18830 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20  ness(0,0);.     
18840 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18850 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
18860 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
18870 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20  ol(BITVEC_TEST, 
18880 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20  size, program). 
18890 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e     **.    ** Run
188a0 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20   a test against 
188b0 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20  a Bitvec object 
188c0 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72  of size.  The pr
188d0 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20  ogram argument. 
188e0 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61     ** is an arra
188f0 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68  y of integers th
18900 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74  at defines the t
18910 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  est.  Return -1 
18920 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f  on a.    ** memo
18930 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
18940 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73  ror, 0 on succes
18950 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66  s, or non-zero f
18960 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  or an error..   
18970 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69   ** See the sqli
18980 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
18990 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74  Test() for addit
189a0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
189b0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
189c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
189d0 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20  RL_BITVEC_TEST: 
189e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
189f0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
18a00 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72  ;.      int *aPr
18a10 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
18a20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20  int*);.      rc 
18a30 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  = sqlite3BitvecB
18a40 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61  uiltinTest(sz, a
18a50 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65  Prog);.      bre
18a60 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
18a70 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
18a80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
18a90 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
18aa0 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64  KS, xBegin, xEnd
18ab0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
18ac0 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74  Register hooks t
18ad0 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61  o call to indica
18ae0 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28  te which malloc(
18af0 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20  ) failures .    
18b00 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20  ** are benign.. 
18b10 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
18b20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
18b30 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
18b40 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  KS: {.      type
18b50 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f  def void (*void_
18b60 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b  function)(void);
18b70 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
18b80 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69  tion xBenignBegi
18b90 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  n;.      void_fu
18ba0 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e  nction xBenignEn
18bb0 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  d;.      xBenign
18bc0 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61  Begin = va_arg(a
18bd0 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
18be0 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  );.      xBenign
18bf0 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  End = va_arg(ap,
18c00 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
18c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
18c20 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28  nignMallocHooks(
18c30 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42  xBenignBegin, xB
18c40 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20  enignEnd);.     
18c50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18c60 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
18c70 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
18c80 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
18c90 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  RL_PENDING_BYTE,
18ca0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29   unsigned int X)
18cb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
18cc0 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  et the PENDING b
18cd0 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65  yte to the value
18ce0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
18cf0 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a  , if X>0..    **
18d00 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
18d10 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72   if X==0.  Retur
18d20 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
18d30 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a  he pending byte.
18d40 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69      ** as it exi
18d50 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69  sting before thi
18d60 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
18d70 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  lled..    **.   
18d80 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20   ** IMPORTANT:  
18d90 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
18da0 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30  DING byte from 0
18db0 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74  x40000000 result
18dc0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69  s in.    ** an i
18dd0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61  ncompatible data
18de0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  base file format
18df0 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  .  Changing the 
18e00 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20  PENDING byte.   
18e10 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61   ** while any da
18e20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18e30 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74  n is open result
18e40 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61  s in undefined a
18e50 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65  nd.    ** dilete
18e60 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a  rious behavior..
18e70 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
18e80 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
18e90 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a  PENDING_BYTE: {.
18ea0 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49        rc = PENDI
18eb0 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66  NG_BYTE;.#ifndef
18ec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
18ed0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
18ee0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65   unsigned int ne
18ef0 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70  wVal = va_arg(ap
18f00 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b  , unsigned int);
18f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  .        if( new
18f20 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e  Val ) sqlite3Pen
18f30 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61  dingByte = newVa
18f40 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
18f50 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
18f60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
18f70 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
18f80 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
18f90 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
18fa0 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
18fb0 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
18fc0 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
18fd0 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
18fe0 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
18ff0 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  t.    ** assert(
19000 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74  ) was enabled at
19010 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
19020 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64  If X is true and
19030 20 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a   assert().    **
19040 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
19050 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
19060 75 65 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  ue is true.  If 
19070 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20  X is true and.  
19080 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73    ** assert() is
19090 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
190a0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
190b0 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20   is zero.  If X 
190c0 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20  is.    ** false 
190d0 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20  and assert() is 
190e0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
190f0 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65  e assertion fire
19100 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  s and the.    **
19110 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e   process aborts.
19120 20 20 49 66 20 58 20 69 73 20 66 61 6c 73 65 20    If X is false 
19130 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20  and assert() is 
19140 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
19150 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  he.    ** return
19160 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a   value is zero..
19170 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19180 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19190 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20  ASSERT: {.      
191a0 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d  volatile int x =
191b0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
191c0 28 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70  ( (x = va_arg(ap
191d0 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20  ,int))!=0 );.   
191e0 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20     rc = x;.     
191f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
19200 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
19210 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19220 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19230 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20  TRL_ALWAYS, int 
19240 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
19250 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
19260 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
19270 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77   test to see how
19280 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a   the ALWAYS and.
19290 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63      ** NEVER mac
192a0 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ros were defined
192b0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
192c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
192d0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
192e0 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20   is ALWAYS(X).  
192f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19300 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74  he recommended t
19310 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66  est is X==2.  If
19320 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
19330 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61  e is 2, that mea
19340 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53  ns.    ** ALWAYS
19350 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
19360 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61  re both no-op pa
19370 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
19380 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  s, which is the.
19390 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73      ** default s
193a0 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  etting.  If the 
193b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
193c0 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29  1, then ALWAYS()
193d0 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a   is either.    *
193e0 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20  * hard-coded to 
193f0 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20  true or else it 
19400 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61  asserts if its a
19410 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
19420 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
19430 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72  st behavior (har
19440 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29  d-coded to true)
19450 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
19460 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
19470 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
19480 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
19490 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e  ) is disabled an
194a0 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20  d the second.   
194b0 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73   ** behavior (as
194c0 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75  sert if the argu
194d0 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29  ment to ALWAYS()
194e0 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68   is false) is th
194f0 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
19500 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19510 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
19520 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65  at assert() is e
19530 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nabled..    **. 
19540 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69     ** The run-ti
19550 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  me test procedur
19560 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d  e might look som
19570 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73  ething like this
19580 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
19590 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
195a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
195b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
195c0 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20  YS, 2)==2 ){.   
195d0 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
195e0 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
195f0 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d   are no-op pass-
19600 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20  through macros. 
19610 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69     **    }else i
19620 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
19630 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
19640 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
19650 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  1) ){.    **    
19660 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61    // ALWAYS(x) a
19670 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73  sserts that x is
19680 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20   true. NEVER(x) 
19690 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c  asserts x is fal
196a0 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  se..    **    }e
196b0 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  lse{.    **     
196c0 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73   // ALWAYS(x) is
196d0 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20   a constant 1.  
196e0 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f  NEVER(x) is a co
196f0 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a  nstant 0..    **
19700 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20      }.    */.   
19710 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
19720 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a  TCTRL_ALWAYS: {.
19730 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
19740 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
19750 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28      rc = ALWAYS(
19760 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
19770 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
19780 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19790 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
197a0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73  TCTRL_RESERVE, s
197b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
197c0 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
197d0 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76   Set the nReserv
197e0 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20  e size to N for 
197f0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
19800 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
19810 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  e.    ** connect
19820 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20  ion db..    */. 
19830 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
19840 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a  ESTCTRL_RESERVE:
19850 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19860 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
19870 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
19880 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
19890 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
198a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
198b0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
198c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
198d0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64  reeSetPageSize(d
198e0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
198f0 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , x, 0);.      s
19900 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
19910 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
19920 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19930 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
19940 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
19950 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19960 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73  OPTIMIZATIONS, s
19970 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
19980 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
19990 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
199a0 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  le various optim
199b0 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73  izations for tes
199c0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
199d0 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75  The .    ** argu
199e0 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d  ment N is a bitm
199f0 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74  ask of optimizat
19a00 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62  ions to be disab
19a10 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c  led.  For normal
19a20 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
19a30 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e  n N should be 0.
19a40 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68    The idea is th
19a50 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61  at a test progra
19a60 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20  m (like the.    
19a70 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73  ** SQL Logic Tes
19a80 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f  t or SLT test mo
19a90 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68  dule) can run th
19aa0 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69  e same SQL multi
19ab0 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a  ple times.    **
19ac0 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70   with various op
19ad0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61  timizations disa
19ae0 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  bled to verify t
19af0 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73  hat the same ans
19b00 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62  wer.    ** is ob
19b10 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20  tained in every 
19b20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
19b30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
19b40 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
19b50 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ONS: {.      sql
19b60 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
19b70 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
19b80 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74  .      db->dbOpt
19b90 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61  Flags = (u16)(va
19ba0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20  _arg(ap, int) & 
19bb0 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62  0xffff);.      b
19bc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
19bd0 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  def SQLITE_N_KEY
19be0 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69  WORD.    /* sqli
19bf0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
19c00 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
19c10 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73  _ISKEYWORD, cons
19c20 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20  t char *zWord). 
19c30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
19c40 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f  zWord is a keywo
19c50 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79  rd recognized by
19c60 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
19c70 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20  n return the.   
19c80 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65   ** number of ke
19c90 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a  ywords.  Or if z
19ca0 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65  Word is not a ke
19cb0 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e  yword, return 0.
19cc0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
19cd0 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72  This test featur
19ce0 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
19cf0 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67  ble in the amalg
19d00 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20  amation since.  
19d10 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
19d20 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20  N_KEYWORD macro 
19d30 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69  is not defined i
19d40 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53  n this file if S
19d50 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20  QLite.    ** is 
19d60 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61  built using sepa
19d70 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65  rate source file
19d80 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
19d90 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
19da0 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a  RL_ISKEYWORD: {.
19db0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
19dc0 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67   *zWord = va_arg
19dd0 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
19de0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
19df0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
19e00 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72  (zWord);.      r
19e10 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77  c = (sqlite3Keyw
19e20 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f  ordCode((u8*)zWo
19e30 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f  rd, n)!=TK_ID) ?
19e40 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
19e50 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65  D : 0;.      bre
19e60 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
19e70 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65   ..    /* sqlite
19e80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
19e90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
19ea0 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a  CRATCHMALLOC, sz
19eb0 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29 3b  , &pNew, pFree);
19ec0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50  .    **.    ** P
19ed0 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20 73  ass pFree into s
19ee0 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
19ef0 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e(). .    ** If 
19f00 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61  sz>0 then alloca
19f10 74 65 20 61 20 73 63 72 61 74 63 68 20 62 75 66  te a scratch buf
19f20 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20  fer into pNew.  
19f30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
19f40 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19f50 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20  _SCRATCHMALLOC: 
19f60 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 46  {.      void *pF
19f70 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20  ree, **ppNew;.  
19f80 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
19f90 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70    sz = va_arg(ap
19fa0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 70  , int);.      pp
19fb0 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  New = va_arg(ap,
19fc0 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20   void**);.      
19fd0 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28 61  pFree = va_arg(a
19fe0 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
19ff0 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65 77   if( sz ) *ppNew
1a000 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
1a010 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20  hMalloc(sz);.   
1a020 20 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63     sqlite3Scratc
1a030 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20  hFree(pFree);.  
1a040 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a050 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1a060 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1a070 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a080 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c  LOCALTIME_FAULT,
1a090 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20   int onoff);.   
1a0a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61   **.    ** If pa
1a0b0 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73  rameter onoff is
1a0c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69   non-zero, confi
1a0d0 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65 72  gure the wrapper
1a0e0 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20  s so that all.  
1a0f0 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
1a100 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69  calls to localti
1a110 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74  me() and variant
1a120 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66  s fail. If onoff
1a130 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a   is zero,.    **
1a140 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69   undo this setti
1a150 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ng..    */.    c
1a160 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1a170 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
1a180 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULT: {.      sql
1a190 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a1a0 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74  .bLocaltimeFault
1a1b0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1a1c0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1a1d0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69  .    }..#if defi
1a1e0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1a1f0 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
1a200 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1a210 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1a220 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58  LITE_TESTCTRL_EX
1a230 50 4c 41 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20  PLAIN_STMT,.    
1a240 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1a250 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a260 33 5f 73 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68  3_stmt*,const ch
1a270 61 72 2a 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  ar**);.    **.  
1a280 20 20 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64    ** If compiled
1a290 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45 4e 41   with SQLITE_ENA
1a2a0 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
1a2b0 2c 20 65 61 63 68 20 73 71 6c 69 74 65 33 5f 73  , each sqlite3_s
1a2c0 74 6d 74 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a  tmt holds.    **
1a2d0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
1a2e0 65 73 63 72 69 62 65 73 20 74 68 65 20 6f 70 74  escribes the opt
1a2f0 69 6d 69 7a 65 64 20 70 61 72 73 65 20 74 72 65  imized parse tre
1a300 65 2e 20 20 54 68 69 73 20 74 65 73 74 2d 63 6f  e.  This test-co
1a310 6e 74 72 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74  ntrol.    ** ret
1a320 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
1a330 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 20  o that string.. 
1a340 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a350 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45  QLITE_TESTCTRL_E
1a360 58 50 4c 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20  XPLAIN_STMT: {. 
1a370 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
1a380 74 20 2a 70 53 74 6d 74 20 3d 20 76 61 5f 61 72  t *pStmt = va_ar
1a390 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 73 74  g(ap, sqlite3_st
1a3a0 6d 74 2a 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  mt*);.      cons
1a3b0 74 20 63 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d  t char **pzRet =
1a3c0 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
1a3d0 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20  t char**);.     
1a3e0 20 2a 70 7a 52 65 74 20 3d 20 73 71 6c 69 74 65   *pzRet = sqlite
1a3f0 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
1a400 28 28 56 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a  ((Vdbe*)pStmt);.
1a410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a420 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1a430 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1a440 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1a450 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
1a460 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20  ORRUPT, int);.  
1a470 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1a480 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20  or clear a flag 
1a490 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74  that indicates t
1a4a0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1a4b0 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20   file is always 
1a4c0 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72  well-.    ** for
1a4d0 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f  med and never co
1a4e0 72 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61  rrupt.  This fla
1a4f0 67 20 69 73 20 63 6c 65 61 72 20 62 79 20 64 65  g is clear by de
1a500 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e  fault, indicatin
1a510 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61  g that.    ** da
1a520 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67  tabase files mig
1a530 68 74 20 68 61 76 65 20 61 72 62 69 74 72 61 72  ht have arbitrar
1a540 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53  y corruption.  S
1a550 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20  etting the flag 
1a560 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65  during.    ** te
1a570 73 74 69 6e 67 20 63 61 75 73 65 73 20 63 65 72  sting causes cer
1a580 74 61 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  tain assert() st
1a590 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
1a5a0 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69 76  code to be activ
1a5b0 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74  ated.    ** that
1a5c0 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61   demonstrat inva
1a5d0 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66  riants on well-f
1a5e0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
1a5f0 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iles..    */.   
1a600 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1a610 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
1a620 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  UPT: {.      sql
1a630 69 74 65 33 43 6f 6e 66 69 67 2e 6e 65 76 65 72  ite3Config.never
1a640 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67  Corrupt = va_arg
1a650 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1a660 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1a670 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
1a680 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1a690 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54  E_OMIT_BUILTIN_T
1a6a0 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  EST */.  return 
1a6b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1a6c0 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 72  s is a utility r
1a6d0 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74  outine, useful t
1a6e0 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  o VFS implementa
1a6f0 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63  tions, that chec
1a700 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ks.** to see if 
1a710 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1a720 77 61 73 20 61 20 55 52 49 20 74 68 61 74 20 63  was a URI that c
1a730 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63 69  ontained a speci
1a740 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61  fic query .** pa
1a750 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20  rameter, and if 
1a760 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76  so obtains the v
1a770 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65 72  alue of the quer
1a780 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  y parameter..**.
1a790 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
1a7a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1a7b0 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65   filename pointe
1a7c0 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  r passed into th
1a7d0 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74  e xOpen().** met
1a7e0 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70  hod of a VFS imp
1a7f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1a800 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e  e zParam argumen
1a810 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
1a820 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61   the.** query pa
1a830 72 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e  rameter we seek.
1a840 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
1a850 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1a860 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a   of the zParam.*
1a870 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69  * parameter if i
1a880 74 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68  t exists.  If th
1a890 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73  e parameter does
1a8a0 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73   not exist, this
1a8b0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
1a8c0 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  rns a NULL point
1a8d0 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  er..*/.const cha
1a8e0 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  r *sqlite3_uri_p
1a8f0 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63  arameter(const c
1a900 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1a910 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
1a920 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65  am){.  if( zFile
1a930 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  name==0 ) return
1a940 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   0;.  zFilename 
1a950 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
1a960 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
1a970 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c  1;.  while( zFil
1a980 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
1a990 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a  int x = strcmp(z
1a9a0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1a9b0 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
1a9c0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
1a9d0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
1a9e0 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30   1;.    if( x==0
1a9f0 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e   ) return zFilen
1aa00 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  ame;.    zFilena
1aa10 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
1aa20 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
1aa30 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   + 1;.  }.  retu
1aa40 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
1aa50 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20  eturn a boolean 
1aa60 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
1aa70 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
1aa80 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  int sqlite3_uri_
1aa90 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68  boolean(const ch
1aaa0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
1aab0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1aac0 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20  m, int bDflt){. 
1aad0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1aae0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
1aaf0 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65  ameter(zFilename
1ab00 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66  , zParam);.  bDf
1ab10 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20  lt = bDflt!=0;. 
1ab20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69   return z ? sqli
1ab30 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c  te3GetBoolean(z,
1ab40 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b   bDflt) : bDflt;
1ab50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ab60 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
1ab70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  r value for a qu
1ab80 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1ab90 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1aba0 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36  sqlite3_uri_int6
1abb0 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  4(.  const char 
1abc0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f  *zFilename,    /
1abd0 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61  * Filename as pa
1abe0 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f  ssed to xOpen */
1abf0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ac00 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20  Param,       /* 
1ac10 55 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f  URI parameter so
1ac20 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ught */.  sqlite
1ac30 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20  3_int64 bDflt   
1ac40 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66      /* return if
1ac50 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69   parameter is mi
1ac60 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ssing */.){.  co
1ac70 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
1ac80 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1ac90 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  ter(zFilename, z
1aca0 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65  Param);.  sqlite
1acb0 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28  3_int64 v;.  if(
1acc0 20 7a 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f   z && sqlite3Ato
1acd0 69 36 34 28 7a 2c 20 26 76 2c 20 73 71 6c 69 74  i64(z, &v, sqlit
1ace0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
1acf0 51 4c 49 54 45 5f 55 54 46 38 29 3d 3d 53 51 4c  QLITE_UTF8)==SQL
1ad00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44  ITE_OK ){.    bD
1ad10 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72  flt = v;.  }.  r
1ad20 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a  eturn bDflt;.}..
1ad30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ad40 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69   Btree pointer i
1ad50 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62  dentified by zDb
1ad60 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  Name.  Return NU
1ad70 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1ad80 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74  .*/.Btree *sqlit
1ad90 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1ada0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1adb0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1adc0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1add0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1ade0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1adf0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20  db->aDb[i].pBt. 
1ae00 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d      && (zDbName=
1ae10 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
1ae20 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62  ICmp(zDbName, db
1ae30 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ->aDb[i].zName)=
1ae40 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
1ae50 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b   return db->aDb[
1ae60 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20  i].pBt;.    }.  
1ae70 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1ae80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ae90 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
1aea0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1aeb0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1aec0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
1aed0 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
1aee0 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66  ar *sqlite3_db_f
1aef0 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20  ilename(sqlite3 
1af00 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1af10 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
1af20 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65  ee *pBt = sqlite
1af30 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1af40 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
1af50 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
1af60 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
1af70 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a  ame(pBt) : 0;.}.
1af80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
1af90 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72  if database is r
1afa0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66  ead-only or 0 if
1afb0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65   read/write.  Re
1afc0 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f  turn -1 if.** no
1afd0 20 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65   such database e
1afe0 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
1aff0 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
1b000 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  y(sqlite3 *db, c
1b010 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1b020 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
1b030 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
1b040 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1b050 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1b060 70 42 74 20 3f 20 73 71 6c 69 74 65 33 50 61 67  pBt ? sqlite3Pag
1b070 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 73 71 6c  erIsreadonly(sql
1b080 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
1b090 42 74 29 29 20 3a 20 2d 31 3b 0a 7d 0a           Bt)) : -1;.}.