/ Hex Artifact Content
Login

Artifact babadd4638315032625ad64139a0b8c09ac77f5d:


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 2f 2a 0a 2a 2a 20  DSAFE; }../*.** 
07a0: 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74  When compiling t
07b0: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 20  he test fixture 
07c0: 6f 72 20 77 69 74 68 20 64 65 62 75 67 67 69 6e  or with debuggin
07d0: 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20 57 69  g enabled (on Wi
07e0: 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20 76 61  n32),.** this va
07f0: 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73 65 74  riable being set
0800: 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 6c   to non-zero wil
0810: 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43 45 20  l cause OSTRACE 
0820: 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74 0a 2a  macros to emit.*
0830: 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f 73 74  * extra diagnost
0840: 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  ic information..
0850: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0860: 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 0a 23  _HAVE_OS_TRACE.#
0870: 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44   ifndef SQLITE_D
0880: 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a 23 20  EBUG_OS_TRACE.# 
0890: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
08a0: 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 20 30  DEBUG_OS_TRACE 0
08b0: 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74 20 73  .# endif.  int s
08c0: 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20 3d 20  qlite3OSTrace = 
08d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f  SQLITE_DEBUG_OS_
08e0: 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a 0a 23  TRACE;.#endif..#
08f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
0900: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
0910: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
0920: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
0930: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
0940: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
0950: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
0960: 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a 20 53  NULL and if.** S
0970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
0980: 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65 64 2c  RACE is enabled,
0990: 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73 20 64   then messages d
09a0: 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49 2f 4f  escribing.** I/O
09b0: 20 61 63 74 69 76 65 20 61 72 65 20 77 72 69 74   active are writ
09c0: 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73 20 66  ten using this f
09d0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73 65 20  unction.  These 
09e0: 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72 65 20  messages.** are 
09f0: 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64 65 62  intended for deb
0a00: 75 67 67 69 6e 67 20 61 63 74 69 76 69 74 79 20  ugging activity 
0a10: 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f  only..*/.SQLITE_
0a20: 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49 54 45  API void (SQLITE
0a30: 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49  _CDECL *sqlite3I
0a40: 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68  oTrace)(const ch
0a50: 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23  ar*, ...) = 0;.#
0a60: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
0a70: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  the following gl
0a80: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f  obal variable po
0a90: 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67  ints to a string
0aa0: 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a   which is the.**
0ab0: 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
0ac0: 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20  tory, then that 
0ad0: 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62  directory will b
0ae0: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
0af0: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ** temporary fil
0b00: 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  es..**.** See al
0b10: 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20 74  so the "PRAGMA t
0b20: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
0b30: 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ory" SQL command
0b40: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
0b50: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
0b60: 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66  y = 0;../*.** If
0b70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   the following g
0b80: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 70  lobal variable p
0b90: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
0ba0: 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a  g which is the.*
0bb0: 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  * name of a dire
0bc0: 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61 74  ctory, then that
0bd0: 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20   directory will 
0be0: 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  be used to store
0bf0: 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61 73 65  .** all database
0c00: 20 66 69 6c 65 73 20 73 70 65 63 69 66 69 65 64   files specified
0c10: 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
0c20: 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   pathname..**.**
0c30: 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50   See also the "P
0c40: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
0c50: 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20  _directory" SQL 
0c60: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72  command..*/.char
0c70: 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64   *sqlite3_data_d
0c80: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f  irectory = 0;../
0c90: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0ca0: 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  SQLite.  .**.** 
0cb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
0cc0: 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 69  t be called to i
0cd0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
0ce0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  mory allocation,
0cf0: 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d 75 74  .** VFS, and mut
0d00: 65 78 20 73 75 62 73 79 73 74 65 6d 73 20 70 72  ex subsystems pr
0d10: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79  ior to doing any
0d20: 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20 77 69   serious work wi
0d30: 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 42  th.** SQLite.  B
0d40: 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 79 6f  ut as long as yo
0d50: 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69 6c 65  u do not compile
0d60: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
0d70: 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20 74 68  T_AUTOINIT.** th
0d80: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
0d90: 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f 6d 61  be called automa
0da0: 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79 20 72  tically by key r
0db0: 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61 73 0a  outines such as.
0dc0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0dd0: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
0de0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
0df0: 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69 74 73  op except on its
0e00: 20 76 65 72 79 20 66 69 72 73 74 20 63 61 6c 6c   very first call
0e10: 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65 73 73   for the process
0e20: 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68 65 20  ,.** or for the 
0e30: 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74 65 72  first call after
0e40: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
0e50: 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a  e3_shutdown..**.
0e60: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 68 72  ** The first thr
0e70: 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ead to call this
0e80: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 68   routine runs th
0e90: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
0ea0: 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f   to.** completio
0eb0: 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75 65 6e  n.  If subsequen
0ec0: 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c 20 74  t threads call t
0ed0: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 66 6f  his routine befo
0ee0: 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
0ef0: 74 68 72 65 61 64 20 68 61 73 20 66 69 6e 69 73  thread has finis
0f00: 68 65 64 20 74 68 65 20 69 6e 69 74 69 61 6c 69  hed the initiali
0f10: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2c 20  zation process, 
0f20: 74 68 65 6e 20 74 68 65 20 73 75 62 73 65 71 75  then the subsequ
0f30: 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 6d  ent.** threads m
0f40: 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20  ust block until 
0f50: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
0f60: 20 66 69 6e 69 73 68 65 73 20 77 69 74 68 20 74   finishes with t
0f70: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
0f80: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
0f90: 73 74 20 74 68 72 65 61 64 20 6d 69 67 68 74 20  st thread might 
0fa0: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
0fb0: 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 20  e recursively.  
0fc0: 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c  Recursive.** cal
0fd0: 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ls to this routi
0fe0: 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 6c  ne should not bl
0ff0: 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20  ock, of course. 
1000: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 0a 2a   Otherwise the.*
1010: 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  * initialization
1020: 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64 20 6e   process would n
1030: 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a  ever complete..*
1040: 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20 74 68  *.** Let X be th
1050: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 74  e first thread t
1060: 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  o enter this rou
1070: 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62 65 20  tine.  Let Y be 
1080: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 74 68  some other.** th
1090: 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68 69 6c  read.  Then whil
10a0: 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20 69 6e  e the initial in
10b0: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 73  vocation of this
10c0: 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20 69 73   routine by X is
10d0: 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65 2c 20  .** incomplete, 
10e0: 69 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74  it is required t
10f0: 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  hat:.**.**    * 
1100: 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72   Calls to this r
1110: 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20 6d 75  outine from Y mu
1120: 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  st block until t
1130: 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a  he outer-most.**
1140: 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79 20 58         call by X
1150: 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a   completes..**.*
1160: 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73 69 76  *    *  Recursiv
1170: 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20  e calls to this 
1180: 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 72  routine from thr
1190: 65 61 64 20 58 20 72 65 74 75 72 6e 20 69 6d 6d  ead X return imm
11a0: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  ediately.**     
11b0: 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69    without blocki
11c0: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
11d0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f  e3_initialize(vo
11e0: 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  id){.  MUTEX_LOG
11f0: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
1200: 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 20 20  x *pMaster; )   
1210: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
1220: 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a  static mutex */.
1230: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1260: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1270: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1280: 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e 74 20  XTRA_INIT.  int 
1290: 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d 20  bRunExtraInit = 
12a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
12c0: 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  a initialization
12d0: 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e 64 69   needed */.#endi
12e0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
12f0: 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63 20 3d  _OMIT_WSD.  rc =
1300: 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69   sqlite3_wsd_ini
1310: 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20 20 69  t(4096, 24);.  i
1320: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1330: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1340: 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
1350: 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f   /* If the follo
1360: 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 66 61  wing assert() fa
1370: 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62 73 63  ils on some obsc
1380: 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f 63 6f  ure processor/co
1390: 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f 6d 62  mpiler.  ** comb
13a0: 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77 6f 72  ination, the wor
13b0: 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f 20 73  k-around is to s
13c0: 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  et the correct p
13d0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69 7a 65  ointer.  ** size
13e0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
13f0: 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
1400: 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70 69 6c  PTRSIZE=n compil
1410: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 2a 2f  e-time option */
1420: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
1430: 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a 65 6f  E_PTRSIZE==sizeo
1440: 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20 20 2f  f(char*) );..  /
1450: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61  * If SQLite is a
1460: 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c  lready completel
1470: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74  y initialized, t
1480: 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a 20 20  hen this call.  
1490: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e  ** to sqlite3_in
14a0: 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c  itialize() shoul
14b0: 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  d be a no-op.  B
14c0: 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ut the initializ
14d0: 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20  ation.  ** must 
14e0: 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f  be complete.  So
14f0: 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74   isInit must not
1500: 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20 74 68   be set until th
1510: 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20  e very end.  ** 
1520: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
1530: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
1540: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1550: 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20  isInit ) return 
1560: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1570: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d   Make sure the m
1580: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 69  utex subsystem i
1590: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  s initialized.  
15a0: 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20  If unable to .  
15b0: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
15c0: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
15d0: 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20  m, return early 
15e0: 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 2e 0a  with the error..
15f0: 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79 73 74    ** If the syst
1600: 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20 74 68  em is so sick th
1610: 61 74 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  at we are unable
1620: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d   to allocate a m
1630: 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65  utex,.  ** there
1640: 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c   is not much SQL
1650: 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  ite is going to 
1660: 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20  be able to do.. 
1670: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74   **.  ** The mut
1680: 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d 75 73  ex subsystem mus
1690: 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20 73  t take care of s
16a0: 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f  erializing its o
16b0: 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  wn.  ** initiali
16c0: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  zation..  */.  r
16d0: 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  c = sqlite3Mutex
16e0: 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20 72 63  Init();.  if( rc
16f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1700: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1710: 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74  he malloc() syst
1720: 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63 75 72  em and the recur
1730: 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65 78 20  sive pInitMutex 
1740: 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73  mutex..  ** This
1750: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 72   operation is pr
1760: 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53  otected by the S
1770: 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d 75 74  TATIC_MASTER mut
1780: 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  ex.  Note that. 
1790: 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29   ** MutexAlloc()
17a0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 61   is called for a
17b0: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 70 72   static mutex pr
17c0: 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ior to initializ
17d0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c  ing the.  ** mal
17e0: 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2d 20  loc subsystem - 
17f0: 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  this implies tha
1800: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
1810: 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20 20 2a   of a static.  *
1820: 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e 6f 74  * mutex must not
1830: 20 72 65 71 75 69 72 65 20 73 75 70 70 6f 72 74   require support
1840: 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63   from the malloc
1850: 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f   subsystem..  */
1860: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
1870: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
1880: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1890: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
18a0: 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
18b0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
18c0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 69 66 28  (pMaster);.  if(
18d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20  nfig.isInit ){. 
18f0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1900: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1910: 73 4d 75 74 65 78 49 6e 69 74 20 29 3b 0a 20 20  sMutexInit );.  
1920: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1930: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1940: 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 3b 0a 20 20  MallocInit );.  
1950: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1960: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
1970: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1980: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
1990: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19a0: 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 31 3b  isMutexInit = 1;
19b0: 20 2f 2a 20 70 6f 73 73 69 62 6c 79 20 72 65 64   /* possibly red
19c0: 75 6e 64 61 6e 74 20 2a 2f 0a 20 20 69 66 28 20  undant */.  if( 
19d0: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
19e0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
19f0: 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
1a00: 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28  lite3MallocInit(
1a10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1a20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1a40: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
1a50: 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  it = 1;.    if( 
1a60: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1a70: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
1a80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1aa0: 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20  itMutex =.      
1ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65       sqlite3Mute
1ac0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
1ad0: 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
1ae0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1af0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
1b00: 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c  oreMutex && !sql
1b10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1b20: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
1b30: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1b50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
1b60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
1b80: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
1b90: 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a  nitMutex++;.  }.
1ba0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bb0: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
1bc0: 0a 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e  .  /* If rc is n
1bd0: 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20  ot SQLITE_OK at 
1be0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
1bf0: 20 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c   either the mall
1c00: 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65  oc.  ** subsyste
1c10: 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69  m could not be i
1c20: 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68  nitialized or th
1c30: 65 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20  e system failed 
1c40: 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  to allocate.  **
1c50: 20 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20   the pInitMutex 
1c60: 6d 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e  mutex. Return an
1c70: 20 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72   error in either
1c80: 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28   case.  */.  if(
1c90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ca0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1cb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68  .  }..  /* Do th
1cc0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e  e rest of the in
1cd0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64  itialization und
1ce0: 65 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  er the recursive
1cf0: 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74   mutex so.  ** t
1d00: 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61  hat we will be a
1d10: 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65  ble to handle re
1d20: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e  cursive calls in
1d30: 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
1d40: 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54  initialize().  T
1d50: 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
1d60: 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65  ls normally come
1d70: 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71   through.  ** sq
1d80: 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20  lite3_os_init() 
1d90: 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20  when it invokes 
1da0: 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1db0: 73 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65  ster(), but othe
1dc0: 72 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65  r.  ** recursive
1dd0: 20 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73   calls might als
1de0: 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  o be possible.. 
1df0: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
1e00: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30  NTATION-OF: R-00
1e10: 31 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65  140-37445 SQLite
1e20: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73   automatically s
1e30: 65 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a  erializes calls.
1e40: 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69    ** to the xIni
1e50: 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65  t method, so the
1e60: 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65   xInit method ne
1e70: 65 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64  ed not be thread
1e80: 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  safe..  **.  ** 
1e90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75  The following mu
1ea0: 74 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69  tex is what seri
1eb0: 61 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f  alizes access to
1ec0: 20 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63   the appdef pcac
1ed0: 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65  he xInit.  ** me
1ee0: 74 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69  thods.  The sqli
1ef0: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
1f00: 64 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69  ds.xInit() all i
1f10: 73 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68  s embedded in th
1f20: 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  e.  ** call to s
1f30: 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74  qlite3PcacheInit
1f40: 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20  ialize()..  */. 
1f50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1f60: 6e 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62  nter(sqlite3Glob
1f70: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1f80: 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tex);.  if( sqli
1f90: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fa0: 69 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c  isInit==0 && sql
1fb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1fc0: 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29  .inProgress==0 )
1fd0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73  {.    FuncDefHas
1fe0: 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42  h *pHash = &GLOB
1ff0: 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20  AL(FuncDefHash, 
2000: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
2010: 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c  ctions);.    sql
2020: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2030: 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b  .inProgress = 1;
2040: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73  .    memset(pHas
2050: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c  h, 0, sizeof(sql
2060: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
2070: 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ons));.    sqlit
2080: 65 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c  e3RegisterGlobal
2090: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20  Functions();.   
20a0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
20b0: 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68  alConfig.isPCach
20c0: 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eInit==0 ){.    
20d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
20e0: 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29  acheInitialize()
20f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2100: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2120: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
2130: 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  cheInit = 1;.   
2140: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2150: 73 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20  sInit();.    }. 
2160: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2170: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2180: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2190: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
21a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
21b0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
21c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
21d0: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
21e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
21f0: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2200: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2210: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2220: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2230: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
2240: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
2250: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
2260: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2270: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
2280: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2290: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
22a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
22b0: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
22c0: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
22d0: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
22e0: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
22f0: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2300: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2310: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2320: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
2330: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2340: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
2350: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2360: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
2370: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2380: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2390: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
23a0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
23c0: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
23d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
23e0: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
23f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2400: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2410: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2420: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
2430: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2440: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
2450: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
2460: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
2470: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
2480: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2490: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
24a0: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
24b0: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
24c0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
24d0: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
24e0: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
24f0: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2500: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2510: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2520: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
2530: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
2540: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
2550: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
2560: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
2570: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2580: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2590: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
25a0: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
25b0: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
25c0: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
25d0: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20  ements. */.  if 
25e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25f0: 29 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28  ){.    u64 x = (
2600: 28 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b  ((u64)1)<<63)-1;
2610: 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20  .    double y;. 
2620: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
2630: 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73  (x)==8);.    ass
2640: 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73  ert(sizeof(x)==s
2650: 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d  izeof(y));.    m
2660: 65 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29  emcpy(&y, &x, 8)
2670: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
2680: 6c 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b  lite3IsNaN(y) );
2690: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  .  }.#endif.#end
26a0: 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72  if..  /* Do extr
26b0: 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  a initialization
26c0: 20 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64   steps requested
26d0: 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45   by the SQLITE_E
26e0: 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63  XTRA_INIT.  ** c
26f0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
2700: 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  on..  */.#ifdef 
2710: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2720: 54 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72  T.  if( bRunExtr
2730: 61 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  aInit ){.    int
2740: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e   SQLITE_EXTRA_IN
2750: 49 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  IT(const char*);
2760: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2770: 5f 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a  _EXTRA_INIT(0);.
2780: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
2790: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27a0: 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63  * Undo the effec
27b0: 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e  ts of sqlite3_in
27c0: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73  itialize().  Mus
27d0: 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  t not be called 
27e0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61  while.** there a
27f0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
2800: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2810: 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c  ons or memory al
2820: 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20  locations or.** 
2830: 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f  while any part o
2840: 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65  f SQLite is othe
2850: 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20  rwise in use in 
2860: 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69  any thread.  Thi
2870: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
2880: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20  not threadsafe. 
2890: 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20   But it is safe 
28a0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  to invoke this r
28b0: 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65  outine.** on whe
28c0: 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  n SQLite is alre
28d0: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20  ady shut down.  
28e0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  If SQLite is alr
28f0: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a  eady shut down.*
2900: 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
2910: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  ine is invoked, 
2920: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
2930: 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
2940: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
2950: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76  lite3_shutdown(v
2960: 6f 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  oid){.#ifdef SQL
2970: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69  ITE_OMIT_WSD.  i
2980: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
2990: 77 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32  wsd_init(4096, 2
29a0: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
29b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
29c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
29d0: 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69  ndif..  if( sqli
29e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
29f0: 69 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66  isInit ){.#ifdef
2a00: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48   SQLITE_EXTRA_SH
2a10: 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20  UTDOWN.    void 
2a20: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2a30: 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20  TDOWN(void);.   
2a40: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48   SQLITE_EXTRA_SH
2a50: 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66  UTDOWN();.#endif
2a60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .    sqlite3_os_
2a70: 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  end();.    sqlit
2a80: 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78  e3_reset_auto_ex
2a90: 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73  tension();.    s
2aa0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ab0: 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  ig.isInit = 0;. 
2ac0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2ad0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50  GlobalConfig.isP
2ae0: 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20  CacheInit ){.   
2af0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
2b00: 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71  utdown();.    sq
2b10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2b20: 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d  g.isPCacheInit =
2b30: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
2b40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2b50: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29  g.isMallocInit )
2b60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c  {.    sqlite3Mal
2b70: 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71  locEnd();.    sq
2b80: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2b90: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
2ba0: 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   0;..#ifndef SQL
2bb0: 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57  ITE_OMIT_SHUTDOW
2bc0: 4e 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20  N_DIRECTORIES.  
2bd0: 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75    /* The heap su
2be0: 62 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20  bsystem has now 
2bf0: 62 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e  been shutdown an
2c00: 64 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61  d these values a
2c10: 72 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20  re supposed.    
2c20: 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72  ** to be NULL or
2c30: 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79   point to memory
2c40: 20 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e   that was obtain
2c50: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
2c60: 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a  malloc(),.    **
2c70: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c   which would rel
2c80: 79 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73  y on that heap s
2c90: 75 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66  ubsystem; theref
2ca0: 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ore, make sure t
2cb0: 68 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75  hese.    ** valu
2cc0: 65 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20  es cannot refer 
2cd0: 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74  to heap memory t
2ce0: 68 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76  hat was just inv
2cf0: 61 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68  alidated when th
2d00: 65 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75  e.    ** heap su
2d10: 62 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74  bsystem was shut
2d20: 64 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f  down.  This is o
2d30: 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20  nly done if the 
2d40: 63 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a  current call to.
2d50: 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63      ** this func
2d60: 74 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e  tion resulted in
2d70: 20 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73   the heap subsys
2d80: 74 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69  tem actually bei
2d90: 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20  ng shutdown..   
2da0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2db0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
2dc0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
2dd0: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
2de0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20   0;.#endif.  }. 
2df0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2e00: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78  alConfig.isMutex
2e10: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2e20: 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20  te3MutexEnd();. 
2e30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2e40: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
2e50: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  it = 0;.  }..  r
2e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41  .}../*.** This A
2e80: 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63  PI allows applic
2e90: 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79  ations to modify
2ea0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66   the global conf
2eb0: 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  iguration of.** 
2ec0: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
2ed0: 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a  ry at run-time..
2ee0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2ef0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
2f00: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
2f10: 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
2f20: 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61  anding.** databa
2f30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  se connections o
2f40: 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  r memory allocat
2f50: 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74  ions.  This rout
2f60: 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68  ine is not.** th
2f70: 72 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75  readsafe.  Failu
2f80: 72 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65  re to heed these
2f90: 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65   warnings can le
2fa0: 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61  ad to unpredicta
2fb0: 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e  ble.** behavior.
2fc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2fd0: 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e  config(int op, .
2fe0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
2ff0: 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
3000: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73  LITE_OK;..  /* s
3010: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20  qlite3_config() 
3020: 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c  shall return SQL
3030: 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74  ITE_MISUSE if it
3040: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c   is invoked whil
3050: 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74  e.  ** the SQLit
3060: 65 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20  e library is in 
3070: 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71  use. */.  if( sq
3080: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3090: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
30a0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
30b0: 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72  BKPT;..  va_star
30c0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
30d0: 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
30e0: 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75  /* Mutex configu
30f0: 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61  ration options a
3100: 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  re only availabl
3110: 65 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66  e in a threadsaf
3120: 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  e.    ** compile
3130: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66  ..    */.#if def
3140: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45  ined(SQLITE_THRE
3150: 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54  ADSAFE) && SQLIT
3160: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20  E_THREADSAFE>0  
3170: 2f 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d  /* IMP: R-54466-
3180: 34 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73  46756 */.    cas
3190: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
31a0: 53 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a  SINGLETHREAD: {.
31b0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
31c0: 45 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39  E-OF: R-02748-19
31d0: 30 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  096 This option 
31e0: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
31f0: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3200: 20 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61   ** Single-threa
3210: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  d. */.      sqli
3220: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3230: 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20  bCoreMutex = 0; 
3240: 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65   /* Disable mute
3250: 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20  x on core */.   
3260: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3270: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
3280: 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62  x = 0;  /* Disab
3290: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e  le mutex on conn
32a0: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  ections */.     
32b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
32c0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
32d0: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
32e0: 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  FE) && SQLITE_TH
32f0: 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d  READSAFE>0 /* IM
3300: 50 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36  P: R-20520-54086
3310: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
3320: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49  ITE_CONFIG_MULTI
3330: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
3340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3350: 52 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68  R-14374-42468 Th
3360: 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74  is option sets t
3370: 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64  he threading mod
3380: 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75  e to.      ** Mu
3390: 6c 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20  lti-thread. */. 
33a0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
33b0: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
33c0: 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61  tex = 1;  /* Ena
33d0: 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72  ble mutex on cor
33e0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
33f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3400: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20  FullMutex = 0;  
3410: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
3420: 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   on connections 
3430: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
3440: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
3450: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3460: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53  THREADSAFE) && S
3470: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3480: 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35  >0 /* IMP: R-595
3490: 39 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20  93-21810 */.    
34a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
34b0: 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b  IG_SERIALIZED: {
34c0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
34d0: 43 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35  CE-OF: R-41220-5
34e0: 31 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e  1800 This option
34f0: 20 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64   sets the thread
3500: 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20  ing mode to.    
3510: 20 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e    ** Serialized.
3520: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3530: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
3540: 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f  oreMutex = 1;  /
3550: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f  * Enable mutex o
3560: 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  n core */.      
3570: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3580: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
3590: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
35a0: 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69  utex on connecti
35b0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ons */.      bre
35c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
35d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
35e0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20  ITE_THREADSAFE) 
35f0: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
3600: 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52  SAFE>0 /* IMP: R
3610: 2d 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a  -63666-48755 */.
3620: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3630: 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a  CONFIG_MUTEX: {.
3640: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79        /* Specify
3650: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
3660: 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61  mutex implementa
3670: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3680: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3690: 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72  g.mutex = *va_ar
36a0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
36b0: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  tex_methods*);. 
36c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
36d0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
36e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45  ined(SQLITE_THRE
36f0: 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54  ADSAFE) && SQLIT
3700: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f  E_THREADSAFE>0 /
3710: 2a 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33  * IMP: R-14450-3
3720: 37 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65  7597 */.    case
3730: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
3740: 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20  ETMUTEX: {.     
3750: 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65   /* Retrieve the
3760: 20 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69   current mutex i
3770: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
3780: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
3790: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  p, sqlite3_mutex
37a0: 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c  _methods*) = sql
37b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
37c0: 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72  .mutex;.      br
37d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
37e0: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
37f0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
3800: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
3810: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39  DENCE-OF: R-5559
3820: 34 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49  4-21030 The SQLI
3830: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
3840: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a   option takes a.
3850: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3860: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
3870: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
3880: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3890: 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
38a0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
38b0: 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72  tructure. The ar
38c0: 67 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73  gument specifies
38d0: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20   alternative.   
38e0: 20 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20     ** low-level 
38f0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3900: 6e 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65  n routines to be
3910: 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
3920: 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20  f the memory.   
3930: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e     ** allocation
3940: 20 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20   routines built 
3950: 69 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a  into SQLite. */.
3960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3970: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76  balConfig.m = *v
3980: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
3990: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b  3_mem_methods*);
39a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
39b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
39c0: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41  ITE_CONFIG_GETMA
39d0: 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LLOC: {.      /*
39e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
39f0: 35 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20  51213-46414 The 
3a00: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
3a10: 54 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74  TMALLOC option t
3a20: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
3a30: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
3a40: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
3a50: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
3a60: 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  e of the.      *
3a70: 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  * sqlite3_mem_me
3a80: 74 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e  thods structure.
3a90: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d   The sqlite3_mem
3aa0: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
3ab0: 72 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66  re is.      ** f
3ac0: 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  illed with the c
3ad0: 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
3ae0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
3af0: 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a  on routines. */.
3b00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3b10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
3b20: 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c  xMalloc==0 ) sql
3b30: 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c  ite3MemSetDefaul
3b40: 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61  t();.      *va_a
3b50: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
3b60: 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73  em_methods*) = s
3b70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3b80: 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61  ig.m;.      brea
3b90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3ba0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3bb0: 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20  MEMSTATUS: {.   
3bc0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3bd0: 46 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37  F: R-61275-35157
3be0: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
3bf0: 49 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74  IG_MEMSTATUS opt
3c00: 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20  ion takes.      
3c10: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
3c20: 6e 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20  nt of type int, 
3c30: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
3c40: 20 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20   boolean, which 
3c50: 65 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a  enables.      **
3c60: 20 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65   or disables the
3c70: 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d   collection of m
3c80: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3c90: 20 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a   statistics. */.
3ca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3cb0: 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74  balConfig.bMemst
3cc0: 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  at = va_arg(ap, 
3cd0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
3ce0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3cf0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3d00: 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20  SCRATCH: {.     
3d10: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3d20: 20 52 2d 30 38 34 30 34 2d 36 30 38 38 37 20 54   R-08404-60887 T
3d30: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61  here are three a
3d40: 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20  rguments to.    
3d50: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46    ** SQLITE_CONF
3d60: 49 47 5f 53 43 52 41 54 43 48 3a 20 41 20 70 6f  IG_SCRATCH: A po
3d70: 69 6e 74 65 72 20 61 6e 20 38 2d 62 79 74 65 20  inter an 8-byte 
3d80: 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 62  aligned memory b
3d90: 75 66 66 65 72 20 66 72 6f 6d 0a 20 20 20 20 20  uffer from.     
3da0: 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 73 63   ** which the sc
3db0: 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  ratch allocation
3dc0: 73 20 77 69 6c 6c 20 62 65 20 64 72 61 77 6e 2c  s will be drawn,
3dd0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65 61 63   the size of eac
3de0: 68 20 73 63 72 61 74 63 68 0a 20 20 20 20 20 20  h scratch.      
3df0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 73  ** allocation (s
3e00: 7a 29 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69  z), and the maxi
3e10: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 63  mum number of sc
3e20: 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  ratch allocation
3e30: 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20  s (N). */.      
3e40: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3e50: 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76  fig.pScratch = v
3e60: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
3e70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
3e80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63  lobalConfig.szSc
3e90: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3ea0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
3eb0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3ec0: 69 67 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61  ig.nScratch = va
3ed0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3ef0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3f00: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
3f10: 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  HE: {.      /* E
3f20: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
3f30: 34 30 38 2d 34 30 35 31 30 20 54 68 65 72 65 20  408-40510 There 
3f40: 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65  are three argume
3f50: 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
3f60: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41  SQLITE_CONFIG_PA
3f70: 47 45 43 41 43 48 45 3a 20 41 20 70 6f 69 6e 74  GECACHE: A point
3f80: 65 72 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69  er to 8-byte ali
3f90: 67 6e 65 64 20 6d 65 6d 6f 72 79 2c 20 74 68 65  gned memory, the
3fa0: 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
3fb0: 66 20 65 61 63 68 20 70 61 67 65 20 62 75 66 66  f each page buff
3fc0: 65 72 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65  er (sz), and the
3fd0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
3fe0: 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73   (N). */.      s
3ff0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4000: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
4010: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
4020: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4030: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
4040: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4050: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4060: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
4070: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4080: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4090: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40a0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
40b0: 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20  CACHE_HDRSZ: {. 
40c0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
40d0: 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32 37 33  -OF: R-39100-273
40e0: 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  17 The SQLITE_CO
40f0: 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53  NFIG_PCACHE_HDRS
4100: 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  Z option takes. 
4110: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
4120: 20 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68   parameter which
4130: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4140: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
4150: 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20 20 20  writes into.    
4160: 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65    ** that intege
4170: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
4180: 65 78 74 72 61 20 62 79 74 65 73 20 70 65 72 20  extra bytes per 
4190: 70 61 67 65 20 72 65 71 75 69 72 65 64 20 66 6f  page required fo
41a0: 72 20 65 61 63 68 20 70 61 67 65 0a 20 20 20 20  r each page.    
41b0: 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43    ** in SQLITE_C
41c0: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e  ONFIG_PAGECACHE.
41d0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
41e0: 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20  g(ap, int*) = . 
41f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4200: 48 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28  HeaderSizeBtree(
4210: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
4220: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4230: 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20 20 20  cache() +.      
4240: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4250: 72 53 69 7a 65 50 63 61 63 68 65 31 28 29 3b 0a  rSizePcache1();.
4260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4270: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4280: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
4290: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
42a0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
42b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
42c0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
42d0: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
42e0: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
42f0: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
4300: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
4310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4320: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4330: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
4340: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  E2: {.      /* E
4350: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
4360: 33 32 35 2d 34 38 33 37 38 20 54 68 65 20 53 51  325-48378 The SQ
4370: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
4380: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
4390: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
43a0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
43b0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
43c0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
43d0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
43e0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68     ** object. Th
43f0: 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63 69 66  is object specif
4400: 69 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63  ies the interfac
4410: 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20 70 61  e to a custom pa
4420: 67 65 20 63 61 63 68 65 0a 20 20 20 20 20 20 2a  ge cache.      *
4430: 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
4440: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
4450: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4460: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
4470: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
4480: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
4490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
44b0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
44c0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
44d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
44e0: 32 32 30 33 35 2d 34 36 31 38 32 20 54 68 65 20  22035-46182 The 
44f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4500: 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20  TPCACHE2 option 
4510: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
4520: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4530: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
4540: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
4550: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4560: 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  2.      ** objec
4570: 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73  t. SQLite copies
4580: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
4590: 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65  page cache imple
45a0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20  mentation into. 
45b0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a       ** that obj
45c0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ect. */.      if
45d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
45e0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
45f0: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
4600: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
4610: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
4620: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
4630: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
4640: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
4650: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
4660: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
4670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4680: 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d   }../* EVIDENCE-
4690: 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32 39 31  OF: R-06626-1291
46a0: 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  1 The SQLITE_CON
46b0: 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20  FIG_HEAP option 
46c0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  is only.** avail
46d0: 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69  able if SQLite i
46e0: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
46f0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 45 4e  either SQLITE_EN
4700: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a  ABLE_MEMSYS3 or.
4710: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
4720: 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72 65 74  _MEMSYS5 and ret
4730: 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f  urns SQLITE_ERRO
4740: 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68  R if invoked oth
4750: 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64  erwise. */.#if d
4760: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4770: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
4780: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4790: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
47a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
47b0: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
47c0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
47d0: 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34 32 31  -OF: R-19854-421
47e0: 32 36 20 54 68 65 72 65 20 61 72 65 20 74 68 72  26 There are thr
47f0: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
4800: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4810: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41 6e 20  CONFIG_HEAP: An 
4820: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 70  8-byte aligned p
4830: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65  ointer to the me
4840: 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20 20 20  mory, the.      
4850: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
4860: 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79  es in the memory
4870: 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74 68 65   buffer, and the
4880: 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   minimum allocat
4890: 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20 20 20  ion size..      
48a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
48b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
48c0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
48d0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
48e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
48f0: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
4900: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4910: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4920: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
4930: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
4940: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4950: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4960: 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eq<1 ){.        
4970: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4980: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20  fig.mnReq = 1;. 
4990: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
49a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
49b0: 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29  ig.mnReq>(1<<12)
49c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
49d0: 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73  ap min request s
49e0: 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20  ize at 2^12 */. 
49f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
4a00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
4a10: 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20   = (1<<12);.    
4a20: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
4a30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4a40: 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
4a50: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
4a60: 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36  CE-OF: R-49920-6
4a70: 30 31 38 39 20 49 66 20 74 68 65 20 66 69 72 73  0189 If the firs
4a80: 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d  t pointer (the m
4a90: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 0a 20  emory pointer). 
4aa0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c         ** is NUL
4ab0: 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 72  L, then SQLite r
4ac0: 65 76 65 72 74 73 20 74 6f 20 75 73 69 6e 67 20  everts to using 
4ad0: 69 74 73 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  its default memo
4ae0: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20  ry allocator.   
4af0: 20 20 20 20 20 2a 2a 20 28 74 68 65 20 73 79 73       ** (the sys
4b00: 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70  tem malloc() imp
4b10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e  lementation), un
4b20: 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f 72 20  doing any prior 
4b30: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20  invocation of.  
4b40: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4b50: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20  CONFIG_MALLOC.. 
4b60: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4b70: 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 73 71 6c    ** Setting sql
4b80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4b90: 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20  .m to all zeros 
4ba0: 77 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f  will cause mallo
4bb0: 63 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  c to.        ** 
4bc0: 72 65 76 65 72 74 20 74 6f 20 69 74 73 20 64 65  revert to its de
4bd0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
4be0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
4bf0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
4c00: 73 20 72 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f  s run.        */
4c10: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
4c20: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
4c30: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
4c40: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
4c50: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
4c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4c70: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4c80: 52 2d 36 31 30 30 36 2d 30 38 39 31 38 20 49 66  R-61006-08918 If
4c90: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e   the memory poin
4ca0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
4cb0: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
4cc0: 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20   ** alternative 
4cd0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ce0: 20 69 73 20 65 6e 67 61 67 65 64 20 74 6f 20 68   is engaged to h
4cf0: 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c  andle all of SQL
4d00: 69 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ites.        ** 
4d10: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4d20: 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64  n needs. */.#ifd
4d30: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d40: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
4d50: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4d60: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4d70: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
4d80: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4d90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4da0: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
4db0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4dc0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4dd0: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
4de0: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
4df0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e00: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
4e10: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4e20: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
4e30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4e40: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
4e50: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
4e60: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4e70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4e80: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
4e90: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4ea0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4eb0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
4ec0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
4ed0: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
4ee0: 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72  tion and its fir
4ef0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
4f00: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
4f10: 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e  is NULL.  Loggin
4f20: 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66  g is disabled if
4f30: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f   the function po
4f40: 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  inter is.    ** 
4f50: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
4f60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4f70: 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  FIG_LOG: {.     
4f80: 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
4f90: 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
4fa0: 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
4fb0: 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
4fc0: 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
4fd0: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
4fe0: 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
4ff0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5000: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
5010: 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76  rg(ap, void(*)(v
5020: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
5030: 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f  har*));.      */
5040: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
5050: 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28  oid(*LOGFUNC_t)(
5060: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
5070: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
5080: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5090: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
50a0: 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a  ap, LOGFUNC_t);.
50b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50c0: 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72  balConfig.pLogAr
50d0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
50e0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  oid*);.      bre
50f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5100: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5110: 2d 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65  -55548-33817 The
5120: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65   compile-time se
5130: 74 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69  tting for URI fi
5140: 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63  lenames.    ** c
5150: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74  an be changed at
5160: 20 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e   start-time usin
5170: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  g the.    ** sql
5180: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
5190: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29  TE_CONFIG_URI,1)
51a0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
51b0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
51c0: 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63  _CONFIG_URI,0) c
51d0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c  onfiguration cal
51e0: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
51f0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5200: 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f  G_URI: {.      /
5210: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5220: 2d 32 35 34 35 31 2d 36 31 31 32 35 20 54 68 65  -25451-61125 The
5230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5240: 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  RI option takes 
5250: 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a  a single.      *
5260: 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  * argument of ty
5270: 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a  pe int. If non-z
5280: 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61  ero, then URI ha
5290: 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c  ndling is global
52a0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  ly.      ** enab
52b0: 6c 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61  led. If the para
52c0: 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  meter is zero, t
52d0: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
52e0: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
52f0: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20     ** disabled. 
5300: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5310: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
5320: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
5330: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
5340: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5350: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5360: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
5370: 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20  EX_SCAN: {.     
5380: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5390: 20 52 2d 33 36 35 39 32 2d 30 32 37 37 32 20 54   R-36592-02772 T
53a0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
53b0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53c0: 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70  SCAN.      ** op
53d0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
53e0: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
53f0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6e  ment which is in
5400: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 20  terpreted as a. 
5410: 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20       ** boolean 
5420: 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 61 62  in order to enab
5430: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
5440: 65 20 75 73 65 20 6f 66 20 63 6f 76 65 72 69 6e  e use of coverin
5450: 67 20 69 6e 64 69 63 65 73 20 66 6f 72 0a 20 20  g indices for.  
5460: 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c      ** full tabl
5470: 65 20 73 63 61 6e 73 20 69 6e 20 74 68 65 20 71  e scans in the q
5480: 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20  uery optimizer. 
5490: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
54a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
54b0: 65 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70  eCis = va_arg(ap
54c0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
54d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
54e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
54f0: 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65  _SQLLOG.    case
5500: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
5510: 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74  QLLOG: {.      t
5520: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c  ypedef void(*SQL
5530: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5540: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
5550: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20  t char*, int);. 
5560: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5570: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
5580: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51   = va_arg(ap, SQ
5590: 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20  LLOGFUNC_t);.   
55a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
55b0: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
55c0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
55d0: 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72  oid *);.      br
55e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
55f0: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
5600: 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53  TE_CONFIG_MMAP_S
5610: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IZE: {.      /* 
5620: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5630: 38 30 36 33 2d 33 38 32 35 38 20 53 51 4c 49 54  8063-38258 SQLIT
5640: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
5650: 5a 45 20 74 61 6b 65 73 20 74 77 6f 20 36 34 2d  ZE takes two 64-
5660: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  bit.      ** int
5670: 65 67 65 72 20 28 73 71 6c 69 74 65 33 5f 69 6e  eger (sqlite3_in
5680: 74 36 34 29 20 76 61 6c 75 65 73 20 74 68 61 74  t64) values that
5690: 20 61 72 65 20 74 68 65 20 64 65 66 61 75 6c 74   are the default
56a0: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
56b0: 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 64  .      ** (the d
56c0: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 66  efault setting f
56d0: 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73  or PRAGMA mmap_s
56e0: 69 7a 65 29 20 61 6e 64 20 74 68 65 20 6d 61 78  ize) and the max
56f0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20  imum allowed.   
5700: 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20     ** mmap size 
5710: 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  limit. */.      
5720: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
5730: 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
5740: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
5750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5760: 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76  int64 mxMmap = v
5770: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
5780: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
5790: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
57a0: 52 2d 35 33 33 36 37 2d 34 33 31 39 30 20 49 66  R-53367-43190 If
57b0: 20 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74   either argument
57c0: 20 74 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   to this option 
57d0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65 67 61  is.      ** nega
57e0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 61 74 20  tive, then that 
57f0: 61 72 67 75 6d 65 6e 74 20 69 73 20 63 68 61 6e  argument is chan
5800: 67 65 64 20 74 6f 20 69 74 73 20 63 6f 6d 70 69  ged to its compi
5810: 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c 74 2e  le-time default.
5820: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5830: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
5840: 52 2d 33 34 39 39 33 2d 34 35 30 33 31 20 54 68  R-34993-45031 Th
5850: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5860: 64 20 6d 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c  d mmap size will
5870: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c   be.      ** sil
5880: 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 20  ently truncated 
5890: 69 66 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  if necessary so 
58a0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
58b0: 20 65 78 63 65 65 64 20 74 68 65 0a 20 20 20 20   exceed the.    
58c0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
58d0: 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  e maximum mmap s
58e0: 69 7a 65 20 73 65 74 20 62 79 20 74 68 65 20 53  ize set by the S
58f0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
5900: 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  IZE.      ** com
5910: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
5920: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5930: 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c   if( mxMmap<0 ||
5940: 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d   mxMmap>SQLITE_M
5950: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a  AX_MMAP_SIZE ){.
5960: 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d          mxMmap =
5970: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
5980: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _SIZE;.      }. 
5990: 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c       if( szMmap<
59a0: 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  0 ) szMmap = SQL
59b0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
59c0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28  _SIZE;.      if(
59d0: 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20   szMmap>mxMmap) 
59e0: 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b  szMmap = mxMmap;
59f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5a00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
5a10: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a20: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a30: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73  onfig.szMmap = s
5a40: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65  zMmap;.      bre
5a50: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53  ak;.    }..#if S
5a60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20  QLITE_OS_WIN && 
5a70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5a80: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20  IN32_MALLOC) /* 
5a90: 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35 35 38  IMP: R-04780-558
5aa0: 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  15 */.    case S
5ab0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
5ac0: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
5ad0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5ae0: 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30 33 33  -OF: R-34926-033
5af0: 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  60 SQLITE_CONFIG
5b00: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 20  _WIN32_HEAPSIZE 
5b10: 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74 0a 20  takes a 32-bit. 
5b20: 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64       ** unsigned
5b30: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74   integer value t
5b40: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
5b50: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
5b60: 66 20 74 68 65 20 63 72 65 61 74 65 64 0a 20 20  f the created.  
5b70: 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a      ** heap. */.
5b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5b90: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
5ba0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5bb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5bc0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5bd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5be0: 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20  NFIG_PMASZ: {.  
5bf0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5c00: 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20  lConfig.szPma = 
5c10: 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
5c20: 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
5c30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5c40: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5c50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5c60: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
5c70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
5c80: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5c90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5ca0: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
5cb0: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
5cc0: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
5cd0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
5ce0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5cf0: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
5d00: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
5d10: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
5d20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5d30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
5d40: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5d50: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5d60: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
5d70: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
5d80: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
5d90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
5da0: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
5db0: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
5dc0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
5dd0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
5de0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5df0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
5e00: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
5e10: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
5e20: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
5e30: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
5e40: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
5e50: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
5e60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
5e70: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
5e80: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
5e90: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
5ea0: 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20  t cnt){.#ifndef 
5eb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
5ec0: 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53  ASIDE.  void *pS
5ed0: 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tart;.  if( db->
5ee0: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29  lookaside.nOut )
5ef0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5f00: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
5f10: 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69 73  /* Free any exis
5f20: 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62  ting lookaside b
5f30: 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20 68  uffer for this h
5f40: 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a  andle before.  *
5f50: 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * allocating a n
5f60: 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e  ew one so we don
5f70: 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65 20  't have to have 
5f80: 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20  space for .  ** 
5f90: 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d 65  both at the same
5fa0: 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   time..  */.  if
5fb0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
5fc0: 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  bMalloced ){.   
5fd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
5fe0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
5ff0: 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  rt);.  }.  /* Th
6000: 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b  e size of a look
6010: 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65 72  aside slot after
6020: 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64   ROUNDDOWN8 need
6030: 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a 20  s to be larger. 
6040: 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e 74   ** than a point
6050: 65 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c 2e  er to be useful.
6060: 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55  .  */.  sz = ROU
6070: 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a  NDDOWN8(sz);  /*
6080: 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30 39   IMP: R-33038-09
6090: 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c  382 */.  if( sz<
60a0: 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f  =(int)sizeof(Loo
60b0: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20 73  kasideSlot*) ) s
60c0: 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e 74  z = 0;.  if( cnt
60d0: 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20  <0 ) cnt = 0;.  
60e0: 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74  if( sz==0 || cnt
60f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20  ==0 ){.    sz = 
6100: 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  0;.    pStart = 
6110: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
6120: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Buf==0 ){.    sq
6130: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
6140: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53  Malloc();.    pS
6150: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  tart = sqlite3Ma
6160: 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20  lloc( sz*cnt ); 
6170: 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34 39   /* IMP: R-61949
6180: 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73 71  -35727 */.    sq
6190: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
61a0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
61b0: 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20 73  pStart ) cnt = s
61c0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
61d0: 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d  (pStart)/sz;.  }
61e0: 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72 74  else{.    pStart
61f0: 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64   = pBuf;.  }.  d
6200: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
6210: 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  art = pStart;.  
6220: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
6230: 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c  ree = 0;.  db->l
6240: 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28 75  ookaside.sz = (u
6250: 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53 74  16)sz;.  if( pSt
6260: 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  art ){.    int i
6270: 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53  ;.    LookasideS
6280: 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  lot *p;.    asse
6290: 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73 69  rt( sz > (int)si
62a0: 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  zeof(LookasideSl
62b0: 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  ot*) );.    p = 
62c0: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
62d0: 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28  pStart;.    for(
62e0: 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69  i=cnt-1; i>=0; i
62f0: 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  --){.      p->pN
6300: 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ext = db->lookas
6310: 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20 20  ide.pFree;.     
6320: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6330: 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20 20  Free = p;.      
6340: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
6350: 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a  ot*)&((u8*)p)[sz
6360: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
6370: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
6380: 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = p;.    db->loo
6390: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
63a0: 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 1;.    db->loo
63b0: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
63c0: 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b   = pBuf==0 ?1:0;
63d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
63e0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
63f0: 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  rt = db;.    db-
6400: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
6410: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6420: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
6430: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 0;.    db->lo
6440: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
6450: 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
6460: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6470: 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20  _LOOKASIDE */.  
6480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
64a0: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
64b0: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
64c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
64d0: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
64e0: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
64f0: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
6500: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
6510: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
6520: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
6530: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
6540: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
6550: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6560: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
6570: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
6580: 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b  eturn db->mutex;
6590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75  .}../*.** Free u
65a0: 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  p as much memory
65b0: 20 61 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20   as we can from 
65c0: 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
65d0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
65e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
65f0: 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
6600: 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ry(sqlite3 *db){
6610: 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65  .  int i;..#ifde
6620: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6630: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
6640: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
6650: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
6660: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
6670: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
6680: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6690: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
66a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
66b0: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f  terAll(db);.  fo
66c0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
66d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; i++){.    Btre
66e0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
66f0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
6700: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50 61   pBt ){.      Pa
6710: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71  ger *pPager = sq
6720: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
6730: 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pBt);.      sqli
6740: 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 70  te3PagerShrink(p
6750: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
6760: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
6770: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
6780: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6790: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
67a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
67b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  OK;.}../*.** Con
67c0: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69  figuration setti
67d0: 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69 76  ngs for an indiv
67e0: 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20 63  idual database c
67f0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74  onnection.*/.int
6800: 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
6810: 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ig(sqlite3 *db, 
6820: 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
6830: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
6840: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
6850: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
6860: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
6870: 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  se SQLITE_DBCONF
6880: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
6890: 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66        void *pBuf
68a0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
68b0: 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  id*); /* IMP: R-
68c0: 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20  26835-10964 */. 
68d0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61       int sz = va
68e0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
68f0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
6900: 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20  7871-25994 */.  
6910: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61      int cnt = va
6920: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
6930: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34      /* IMP: R-04
6940: 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20  460-53386 */.   
6950: 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f     rc = setupLoo
6960: 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c  kaside(db, pBuf,
6970: 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20   sz, cnt);.     
6980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6990: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
69a0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
69b0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20  struct {.       
69c0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a   int op;      /*
69d0: 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   The opcode */. 
69e0: 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b         u32 mask;
69f0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
6a00: 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65  he bit in sqlite
6a10: 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63  3.flags to set/c
6a20: 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20  lear */.      } 
6a30: 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aFlagOp[] = {.  
6a40: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
6a50: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
6a60: 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f 46  KEY,    SQLITE_F
6a70: 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c  oreignKeys    },
6a80: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6a90: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6aa0: 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49 54  E_TRIGGER, SQLIT
6ab0: 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20  E_EnableTrigger 
6ac0: 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   },.      };.   
6ad0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
6ae0: 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  i;.      rc = SQ
6af0: 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49  LITE_ERROR; /* I
6b00: 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37  MP: R-42790-2337
6b10: 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  2 */.      for(i
6b20: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
6b30: 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a  aFlagOp); i++){.
6b40: 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61          if( aFla
6b50: 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b  gOp[i].op==op ){
6b60: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
6b70: 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70  noff = va_arg(ap
6b80: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  , int);.        
6b90: 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61    int *pRes = va
6ba0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
6bb0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6c            int ol
6bc0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
6bd0: 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  gs;.          if
6be0: 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20  ( onoff>0 ){.   
6bf0: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
6c00: 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d  gs |= aFlagOp[i]
6c10: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
6c20: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66   }else if( onoff
6c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6c40: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
6c50: 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b  ~aFlagOp[i].mask
6c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6c70: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46          if( oldF
6c80: 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20  lags!=db->flags 
6c90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6ca0: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
6cb0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
6cc0: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  b);.          }.
6cd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
6ce0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
6cf0: 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66    *pRes = (db->f
6d00: 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69  lags & aFlagOp[i
6d10: 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20  ].mask)!=0;.    
6d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6d30: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
6d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
6d50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6d60: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6d70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
6d80: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
6d90: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
6da0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
6db0: 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e  the buffer z[0..
6dc0: 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c  n-1] contains al
6dd0: 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  l spaces..*/.sta
6de0: 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65  tic int allSpace
6df0: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  s(const char *z,
6e00: 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65   int n){.  while
6e10: 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>0 && z[n-1]=
6e20: 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  =' ' ){ n--; }. 
6e30: 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a   return n==0;.}.
6e40: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
6e50: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
6e60: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61  ting function na
6e70: 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69  med "BINARY" whi
6e80: 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  ch is always.** 
6e90: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
6ea0: 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20   If the padFlag 
6eb0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
6ec0: 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20  NULL then space 
6ed0: 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65  padding at the e
6ee0: 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73  nd.** of strings
6ef0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   is ignored.  Th
6f00: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  is implements th
6f10: 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f  e RTRIM collatio
6f20: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
6f30: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20   binCollFunc(.  
6f40: 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20  void *padFlag,. 
6f50: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
6f60: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
6f70: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
6f80: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
6f90: 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20  .  int rc, n;.  
6fa0: 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20  n = nKey1<nKey2 
6fb0: 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b  ? nKey1 : nKey2;
6fc0: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
6fd0: 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39  F: R-65033-28449
6fe0: 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49   The built-in BI
6ff0: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  NARY collation c
7000: 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72  ompares.  ** str
7010: 69 6e 67 73 20 62 79 74 65 20 62 79 20 62 79 74  ings byte by byt
7020: 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63  e using the memc
7030: 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72  mp() function fr
7040: 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
7050: 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20  C.  ** library. 
7060: 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70  */.  rc = memcmp
7070: 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e  (pKey1, pKey2, n
7080: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
7090: 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61  {.    if( padFla
70a0: 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  g.     && allSpa
70b0: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
70c0: 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20  1)+n, nKey1-n). 
70d0: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
70e0: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b  (((char*)pKey2)+
70f0: 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20  n, nKey2-n).    
7100: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  ){.      /* EVID
7110: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34  ENCE-OF: R-31624
7120: 2d 32 34 37 33 37 20 52 54 52 49 4d 20 69 73 20  -24737 RTRIM is 
7130: 6c 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63 65  like BINARY exce
7140: 70 74 20 74 68 61 74 20 65 78 74 72 61 0a 20 20  pt that extra.  
7150: 20 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61 74      ** spaces at
7160: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74 68   the end of eith
7170: 65 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74  er string do not
7180: 20 63 68 61 6e 67 65 20 74 68 65 20 72 65 73 75   change the resu
7190: 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20 20  lt. In other.   
71a0: 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72     ** words, str
71b0: 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72  ings will compar
71c0: 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61  e equal to one a
71d0: 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61  nother as long a
71e0: 73 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a 20  s they.      ** 
71f0: 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74  differ only in t
7200: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70 61  he number of spa
7210: 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ces at the end..
7220: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
7230: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e  se{.      rc = n
7240: 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20  Key1 - nKey2;.  
7250: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7260: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e   rc;.}../*.** An
7270: 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63  other built-in c
7280: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
7290: 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a  e: NOCASE. .**.*
72a0: 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67  * This collating
72b0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74   sequence is int
72c0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
72d0: 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70   for "case indep
72e0: 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72  endent.** compar
72f0: 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20  ison". SQLite's 
7300: 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70  knowledge of upp
7310: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73  er and lower cas
7320: 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a  e equivalents.**
7330: 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f   extends only to
7340: 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65   the 26 characte
7350: 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45  rs used in the E
7360: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e  nglish language.
7370: 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f  .**.** At the mo
7380: 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e  ment there is on
7390: 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65  ly a UTF-8 imple
73a0: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
73b0: 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43  atic int nocaseC
73c0: 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20  ollatingFunc(.  
73d0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
73e0: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
73f0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
7400: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
7410: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
7420: 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74  .  int r = sqlit
7430: 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20  e3StrNICmp(.    
7440: 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29    (const char *)
7450: 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68  pKey1, (const ch
7460: 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65  ar *)pKey2, (nKe
7470: 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a  y1<nKey2)?nKey1:
7480: 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44  nKey2);.  UNUSED
7490: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
74a0: 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20  ed);.  if( 0==r 
74b0: 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31  ){.    r = nKey1
74c0: 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65  -nKey2;.  }.  re
74d0: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn r;.}../*.**
74e0: 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49   Return the ROWI
74f0: 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  D of the most re
7500: 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73  cent insert.*/.s
7510: 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69  qlite_int64 sqli
7520: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
7530: 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  rowid(sqlite3 *d
7540: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
7550: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
7560: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
7570: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
7580: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
7590: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
75a0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
75b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
75c0: 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f  eturn db->lastRo
75d0: 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  wid;.}../*.** Re
75e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
75f0: 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68  of changes in th
7600: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
7610: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
7620: 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ec()..*/.int sql
7630: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c  ite3_changes(sql
7640: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
7650: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7660: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7670: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7680: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
7690: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
76a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
76b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
76c0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
76d0: 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  >nChange;.}../*.
76e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
76f0: 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
7700: 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61  since the databa
7710: 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70  se handle was op
7720: 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ened..*/.int sql
7730: 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
7740: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
7750: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7760: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
7770: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7780: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
7790: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
77a0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
77b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
77c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
77d0: 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  rn db->nTotalCha
77e0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  nge;.}../*.** Cl
77f0: 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  ose all open sav
7800: 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75  epoints. This fu
7810: 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69  nction only mani
7820: 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f  pulates fields o
7830: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
7840: 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c  e handle object,
7850: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f   it does not clo
7860: 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  se any savepoint
7870: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70  s that may be op
7880: 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74  en.** at the b-t
7890: 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e  ree/pager level.
78a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
78b0: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
78c0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
78d0: 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65  while( db->pSave
78e0: 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76  point ){.    Sav
78f0: 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64  epoint *pTmp = d
7900: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20  b->pSavepoint;. 
7910: 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
7920: 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b  t = pTmp->pNext;
7930: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7940: 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20  ee(db, pTmp);.  
7950: 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69  }.  db->nSavepoi
7960: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53  nt = 0;.  db->nS
7970: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
7980: 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
7990: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
79a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
79b0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
79c0: 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  unction associat
79d0: 65 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20  ed with FuncDef 
79e0: 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70  p, if any. Excep
79f0: 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  t,.** if this is
7a00: 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f   not the last co
7a10: 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  py of the functi
7a20: 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b  on, do not invok
7a30: 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a  e it. Multiple.*
7a40: 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69  * copies of a si
7a50: 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72  ngle function ar
7a60: 65 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63  e created when c
7a70: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
7a80: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69   is called.** wi
7a90: 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73  th SQLITE_ANY as
7aa0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a   the encoding..*
7ab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75  /.static void fu
7ac0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71  nctionDestroy(sq
7ad0: 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44  lite3 *db, FuncD
7ae0: 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65  ef *p){.  FuncDe
7af0: 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72  structor *pDestr
7b00: 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74  uctor = p->pDest
7b10: 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44  ructor;.  if( pD
7b20: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
7b30: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
7b40: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44  ef--;.    if( pD
7b50: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d  estructor->nRef=
7b60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73  =0 ){.      pDes
7b70: 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f  tructor->xDestro
7b80: 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70  y(pDestructor->p
7b90: 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20  UserData);.     
7ba0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7bb0: 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  b, pDestructor);
7bc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7bd0: 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61  .** Disconnect a
7be0: 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ll sqlite3_vtab 
7bf0: 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c  objects that bel
7c00: 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ong to database 
7c10: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62  connection.** db
7c20: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
7c30: 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e   when db is bein
7c40: 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  g closed..*/.sta
7c50: 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e  tic void disconn
7c60: 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74  ectAllVtab(sqlit
7c70: 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66  e3 *db){.#ifndef
7c80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7c90: 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20  TUALTABLE.  int 
7ca0: 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  i;.  HashElem *p
7cb0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
7cc0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
7cd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
7ce0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63  Db; i++){.    Sc
7cf0: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
7d00: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65  db->aDb[i].pSche
7d10: 6d 61 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ma;.    if( db->
7d20: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[i].pSchema )
7d30: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71  {.      for(p=sq
7d40: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
7d50: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
7d60: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
7d70: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20  hNext(p)){.     
7d80: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
7d90: 20 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65   (Table *)sqlite
7da0: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
7db0: 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
7dc0: 61 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74  al(pTab) ) sqlit
7dd0: 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74  e3VtabDisconnect
7de0: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
7df0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7e00: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
7e10: 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75  First(&db->aModu
7e20: 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  le); p; p=sqlite
7e30: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
7e40: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d    Module *pMod =
7e50: 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74   (Module *)sqlit
7e60: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
7e70: 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f    if( pMod->pEpo
7e80: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
7e90: 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65  ite3VtabDisconne
7ea0: 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70  ct(db, pMod->pEp
7eb0: 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oTab);.    }.  }
7ec0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
7ed0: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20  lockList(db);.  
7ee0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
7ef0: 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a  eAll(db);.#else.
7f00: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
7f10: 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d  ER(db);.#endif.}
7f20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
7f30: 52 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20  RUE if database 
7f40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
7f50: 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72  s unfinalized pr
7f60: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
7f70: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
7f80: 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ed sqlite3_backu
7f90: 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a  p objects.  .*/.
7fa0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65  static int conne
7fb0: 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69  ctionIsBusy(sqli
7fc0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
7fd0: 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  j;.  assert( sql
7fe0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7ff0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
8000: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20  if( db->pVdbe ) 
8010: 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28  return 1;.  for(
8020: 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20  j=0; j<db->nDb; 
8030: 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  j++){.    Btree 
8040: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a  *pBt = db->aDb[j
8050: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
8060: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
8070: 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74  eeIsInBackup(pBt
8080: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
8090: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
80a0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
80b0: 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20  existing SQLite 
80c0: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74  database.*/.stat
80d0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c  ic int sqlite3Cl
80e0: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ose(sqlite3 *db,
80f0: 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65   int forceZombie
8100: 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  ){.  if( !db ){.
8110: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
8120: 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37 34  OF: R-63257-1174
8130: 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  0 Calling sqlite
8140: 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20  3_close() or.   
8150: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   ** sqlite3_clos
8160: 65 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e 55  e_v2() with a NU
8170: 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75 6d  LL pointer argum
8180: 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ent is a harmles
8190: 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20  s no-op. */.    
81a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
81b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
81c0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
81d0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
81e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
81f0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
8200: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
8210: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
8220: 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20  x);..  /* Force 
8230: 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c  xDisconnect call
8240: 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c  s on all virtual
8250: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73   tables */.  dis
8260: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64  connectAllVtab(d
8270: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  b);..  /* If a t
8280: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
8290: 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65  en, the disconne
82a0: 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c  ctAllVtab() call
82b0: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
82c0: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
82d0: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
82e0: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
82f0: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
8300: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
8310: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
8320: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
8330: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
8340: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
8350: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
8360: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
8370: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
8380: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
8390: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
83a0: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
83b0: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
83c0: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
83d0: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
83e0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
83f0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
8400: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
8410: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
8420: 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f  * Legacy behavio
8430: 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  r (sqlite3_close
8440: 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20  () behavior) is 
8450: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
8460: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68  QLITE_BUSY if th
8470: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
8480: 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69   not be closed i
8490: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
84a0: 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d  .  if( !forceZom
84b0: 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f  bie && connectio
84c0: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
84d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
84e0: 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
84f0: 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20  E_BUSY, "unable 
8500: 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20  to close due to 
8510: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20  unfinalized ".  
8520: 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73       "statements
8530: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62   or unfinished b
8540: 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71  ackups");.    sq
8550: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
8560: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8570: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8580: 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  BUSY;.  }..#ifde
8590: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
85a0: 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
85b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
85c0: 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
85d0: 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68  /* Closing the h
85e0: 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
85f0: 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
8600: 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a  d the value 2. *
8610: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  /.    sqlite3Glo
8620: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
8630: 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g(sqlite3GlobalC
8640: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
8650: 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d  , db, 0, 2);.  }
8660: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
8670: 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63  nvert the connec
8680: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62  tion into a zomb
8690: 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73  ie and then clos
86a0: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d  e it..  */.  db-
86b0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
86c0: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20  MAGIC_ZOMBIE;.  
86d0: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
86e0: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
86f0: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
8700: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8710: 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73  * Two variations
8720: 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69   on the public i
8730: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f  nterface for clo
8740: 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  sing a database.
8750: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  ** connection. T
8760: 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  he sqlite3_close
8770: 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72  () version retur
8780: 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ns SQLITE_BUSY a
8790: 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65  nd.** leaves the
87a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69   connection opti
87b0: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
87c0: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70  unfinalized prep
87d0: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
87e0: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
87f0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73   sqlite3_backups
8800: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  .  The sqlite3_c
8810: 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72  lose_v2().** ver
8820: 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20  sion forces the 
8830: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
8840: 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66  come a zombie if
8850: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e   there are.** un
8860: 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73  closed resources
8870: 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66  , and arranges f
8880: 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  or deallocation 
8890: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a  when the last.**
88a0: 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
88b0: 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  nt or sqlite3_ba
88c0: 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a  ckup closes..*/.
88d0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
88e0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  e(sqlite3 *db){ 
88f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
8900: 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74  ose(db,0); }.int
8910: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
8920: 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  2(sqlite3 *db){ 
8930: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
8940: 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f  ose(db,1); }.../
8950: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d  *.** Close the m
8960: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
8970: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
8980: 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  **.** Furthermor
8990: 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63  e, if database c
89a0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
89b0: 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e  a zombie (meanin
89c0: 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  g that there.** 
89d0: 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72  has been a prior
89e0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
89f0: 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71  _close(db) or sq
8a00: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64  lite3_close_v2(d
8a10: 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79  b)) and.** every
8a20: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61   sqlite3_stmt ha
8a30: 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c  s now been final
8a40: 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73  ized and every s
8a50: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61  qlite3_backup ha
8a60: 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74  s.** finished, t
8a70: 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73  hen free all res
8a80: 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ources..*/.void 
8a90: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
8aa0: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
8ab0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8ac0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20  HashElem *i;    
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74  /* Hash table it
8af0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
8b00: 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  j;..  /* If ther
8b10: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
8b20: 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  g sqlite3_stmt o
8b30: 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  r sqlite3_backup
8b40: 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72   objects.  ** or
8b50: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
8b60: 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  on has not yet b
8b70: 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71  een closed by sq
8b80: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
8b90: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74  ,.  ** then just
8ba0: 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78   leave the mutex
8bb0: 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
8bc0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  /.  if( db->magi
8bd0: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
8be0: 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63  ZOMBIE || connec
8bf0: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
8c00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
8c10: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
8c20: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
8c30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
8c40: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
8c50: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
8c60: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
8c70: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20  onnection has.  
8c80: 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71  ** closed all sq
8c90: 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73  lite3_stmt and s
8ca0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
8cb0: 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65  jects and has be
8cc0: 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74  en.  ** passed t
8cd0: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20  o sqlite3_close 
8ce0: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74  (meaning that it
8cf0: 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20   is a zombie).  
8d00: 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20  Therefore,.  ** 
8d10: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65  go ahead and fre
8d20: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
8d30: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  .  */..  /* If a
8d40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
8d50: 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61  open, roll it ba
8d60: 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e  ck. This also en
8d70: 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20  sures that if.  
8d80: 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  ** any database 
8d90: 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65  schemas have bee
8da0: 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e  n modified by an
8db0: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61   uncommitted tra
8dc0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68  nsaction.  ** th
8dd0: 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e  ey are reset. An
8de0: 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69  d that the requi
8df0: 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
8e00: 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65   is held to make
8e10: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20  .  ** the pager 
8e20: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
8e30: 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f  ema reset an ato
8e40: 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a  mic operation. *
8e50: 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  /.  sqlite3Rollb
8e60: 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
8e70: 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  E_OK);..  /* Fre
8e80: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
8e90: 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  g Savepoint stru
8ea0: 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c  ctures. */.  sql
8eb0: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
8ec0: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43  nts(db);..  /* C
8ed0: 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73  lose all databas
8ee0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
8ef0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
8f00: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
8f10: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
8f20: 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20  = &db->aDb[j];. 
8f30: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
8f40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8f50: 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e  BtreeClose(pDb->
8f60: 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  pBt);.      pDb-
8f70: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >pBt = 0;.      
8f80: 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20  if( j!=1 ){.    
8f90: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
8fa0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
8fb0: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65    }.  }.  /* Cle
8fc0: 61 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65  ar the TEMP sche
8fd0: 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e  ma separately an
8fe0: 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20  d last */.  if( 
8ff0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
9000: 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ma ){.    sqlite
9010: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d  3SchemaClear(db-
9020: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
9030: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
9040: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
9050: 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70  );..  /* Free up
9060: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75   the array of au
9070: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
9080: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f  s */.  sqlite3Co
9090: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
90a0: 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72  ray(db);.  asser
90b0: 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b  t( db->nDb<=2 );
90c0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
90d0: 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db==db->aDbStati
90e0: 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20  c );..  /* Tell 
90f0: 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69  the code in noti
9100: 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f  fy.c that the co
9110: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67  nnection no long
9120: 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a  er holds any.  *
9130: 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73  * locks and does
9140: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
9150: 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d   further unlock-
9160: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
9170: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
9180: 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64  ConnectionClosed
9190: 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  (db);..  for(j=0
91a0: 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64 62  ; j<ArraySize(db
91b0: 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29  ->aFunc.a); j++)
91c0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
91d0: 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70  Next, *pHash, *p
91e0: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e  ;.    for(p=db->
91f0: 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70  aFunc.a[j]; p; p
9200: 3d 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 70  =pHash){.      p
9210: 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b  Hash = p->pHash;
9220: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
9230: 29 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74  ){.        funct
9240: 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70  ionDestroy(db, p
9250: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  );.        pNext
9260: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
9270: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9280: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
9290: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
92a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
92b0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
92c0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
92d0: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
92e0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
92f0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
9300: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
9310: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9320: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
9330: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
9340: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
9350: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9360: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
9370: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
9380: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
9390: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
93a0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
93b0: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
93c0: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
93d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
93e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
93f0: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
9400: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
9410: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
9420: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9430: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
9440: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
9450: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
9460: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
9470: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9480: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
9490: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
94a0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
94b0: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
94c0: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
94d0: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
94e0: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
94f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  }.    sqlite3Vta
9500: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43  bEponymousTableC
9510: 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a  lear(db, pMod);.
9520: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9530: 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d  e(db, pMod);.  }
9540: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
9550: 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ear(&db->aModule
9560: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  );.#endif..  sql
9570: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
9580: 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61  LITE_OK); /* Dea
9590: 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63  llocates any cac
95a0: 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67  hed error string
95b0: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  s. */.  sqlite3V
95c0: 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72  alueFree(db->pEr
95d0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f  r);.  sqlite3Clo
95e0: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
95f0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
9600: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
9610: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9620: 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73  db->auth.zAuthUs
9630: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er);.  sqlite3_f
9640: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
9650: 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  thPW);.#endif.. 
9660: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
9670: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
9680: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
9690: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
96a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
96b0: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
96c0: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
96d0: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
96e0: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
96f0: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
9700: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
9710: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
9720: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
9730: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
9740: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
9750: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
9760: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
9770: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
9780: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
9790: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
97a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
97b0: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
97c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
97d0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31  ee(db, db->aDb[1
97e0: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ].pSchema);.  sq
97f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9800: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9810: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
9820: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
9830: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9840: 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29  _free(db->mutex)
9850: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
9860: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d  lookaside.nOut==
9870: 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f  0 );  /* Fails o
9880: 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  n a lookaside me
9890: 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69  mory leak */.  i
98a0: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
98b0: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
98c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
98d0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
98e0: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  art);.  }.  sqli
98f0: 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a  te3_free(db);.}.
9900: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
9910: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
9920: 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65  es.  If tripCode
9930: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
9940: 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77  K, then.** any w
9950: 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
9960: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74   invalidated ("t
9970: 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20  ripped" - as in 
9980: 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63  "tripping a circ
9990: 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29  uit.** breaker")
99a0: 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74   and made to ret
99b0: 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20  urn tripCode if 
99c0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75  there are any fu
99d0: 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74  rther.** attempt
99e0: 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75  s to use that cu
99f0: 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73  rsor.  Read curs
9a00: 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20  ors remain open 
9a10: 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74  and valid.** but
9a20: 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e 20   are "saved" in 
9a30: 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 70  case the table p
9a40: 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61  ages are moved a
9a50: 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  round..*/.void s
9a60: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
9a70: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
9a80: 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20  nt tripCode){.  
9a90: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54  int i;.  int inT
9aa0: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rans = 0;.  int 
9ab0: 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  schemaChange;.  
9ac0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9ad0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
9ae0: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
9af0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
9b00: 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74  loc();..  /* Obt
9b10: 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d  ain all b-tree m
9b20: 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61  utexes before ma
9b30: 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74  king any calls t
9b40: 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  o BtreeRollback(
9b50: 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73  ). .  ** This is
9b60: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61   important in ca
9b70: 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
9b80: 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  on being rolled 
9b90: 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f  back has.  ** mo
9ba0: 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
9bb0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74  ase schema. If t
9bc0: 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65  he b-tree mutexe
9bd0: 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a  s are not taken.
9be0: 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20    ** here, then 
9bf0: 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  another shared-c
9c00: 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ache connection 
9c10: 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62  might sneak in b
9c20: 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
9c30: 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63  database rollbac
9c40: 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73  k and schema res
9c50: 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61  et, which can ca
9c60: 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63  use false.  ** c
9c70: 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74  orruption report
9c80: 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e  s in some cases.
9c90: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
9ca0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
9cb0: 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20  .  schemaChange 
9cc0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
9cd0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
9ce0: 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  ges)!=0 && db->i
9cf0: 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20  nit.busy==0;..  
9d00: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
9d10: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
9d20: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
9d30: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
9d40: 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   p ){.      if( 
9d50: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
9d60: 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20  Trans(p) ){.    
9d70: 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b      inTrans = 1;
9d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9d90: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
9da0: 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ack(p, tripCode,
9db0: 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b   !schemaChange);
9dc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9dd0: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
9de0: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  (db);.  sqlite3E
9df0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
9e00: 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  ;..  if( (db->fl
9e10: 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72  ags&SQLITE_Inter
9e20: 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20  nChanges)!=0 && 
9e30: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
9e40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
9e50: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
9e60: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
9e70: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
9e80: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
9e90: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73  ion(db);.  }.  s
9ea0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
9eb0: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41  All(db);..  /* A
9ec0: 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  ny deferred cons
9ed0: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
9ee0: 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  s have now been 
9ef0: 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64  resolved. */.  d
9f00: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
9f10: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66   = 0;.  db->nDef
9f20: 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30  erredImmCons = 0
9f30: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
9f40: 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
9f50: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
9f60: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
9f70: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
9f80: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
9f90: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
9fa0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
9fb0: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
9fc0: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
9fd0: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
9fe0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
9ff0: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
a000: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
a010: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
a020: 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ic string contai
a030: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f  ning the name co
a040: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
a050: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
a060: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
a070: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  e argument..*/.#
a080: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a090: 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29  E_NEED_ERR_NAME)
a0a0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
a0b0: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20  ite3ErrName(int 
a0c0: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
a0d0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
a0e0: 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20  int i, origRc = 
a0f0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
a100: 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20  <2 && zName==0; 
a110: 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29  i++, rc &= 0xff)
a120: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
a130: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
a140: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
a150: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a160: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a180: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a190: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
a1a0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a1b0: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
a1c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a1d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a1e0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
a1f0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
a200: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
a210: 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20  RNAL";          
a220: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a230: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a250: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52  me = "SQLITE_PER
a260: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
a270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a280: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a  se SQLITE_ABORT:
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
a2a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
a2b0: 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  ORT";           
a2c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a2d0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
a2e0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a  _ROLLBACK:     z
a2f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
a300: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  BORT_ROLLBACK"; 
a310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a320: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
a330: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
a340: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a350: 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20  BUSY";          
a360: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a370: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
a380: 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20  Y_RECOVERY:     
a390: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a3a0: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b  _BUSY_RECOVERY";
a3b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a3c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
a3d0: 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20  SY_SNAPSHOT:    
a3e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a3f0: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22  E_BUSY_SNAPSHOT"
a400: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a410: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
a420: 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20  OCKED:          
a430: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a440: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
a450: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a460: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a470: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
a480: 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  HE: zName = "SQL
a490: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
a4a0: 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20  DCACHE";break;. 
a4b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a4c0: 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20  _NOMEM:         
a4d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a4e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  LITE_NOMEM";    
a4f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a500: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a510: 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20  E_READONLY:     
a520: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a530: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b  QLITE_READONLY";
a540: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a550: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a560: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f  TE_READONLY_RECO
a570: 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  VERY:  zName = "
a580: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a590: 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b  RECOVERY"; break
a5a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a5b0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
a5c0: 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  TLOCK:  zName = 
a5d0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
a5e0: 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61  _CANTLOCK"; brea
a5f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a600: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
a610: 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  LLBACK:  zName =
a620: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
a630: 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  Y_ROLLBACK"; bre
a640: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a650: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
a660: 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20  BMOVED:   zName 
a670: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
a680: 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72  LY_DBMOVED";  br
a690: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a6a0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
a6b0: 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  :          zName
a6c0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
a6d0: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62  RUPT";         b
a6e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a6f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
a700: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
a710: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a720: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
a730: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a740: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
a750: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EAD:         zNa
a760: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a770: 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20  RR_READ";       
a780: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a790: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a7a0: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e  SHORT_READ:   zN
a7b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a7c0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
a7d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a7e0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a7f0: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a  _WRITE:        z
a800: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a810: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
a820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a830: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a840: 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20  R_FSYNC:        
a850: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a860: 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20  IOERR_FSYNC";   
a870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a880: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a890: 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20  RR_DIR_FSYNC:   
a8a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a8b0: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
a8c0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
a8d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a8e0: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
a8f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a900: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
a910: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
a920: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a930: 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20  OERR_FSTAT:     
a940: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a950: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
a960: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a970: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a980: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20  IOERR_UNLOCK:   
a990: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a9a0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
a9b0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a9c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a9d0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20  _IOERR_RDLOCK:  
a9e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a9f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
aa00: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
aa10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
aa20: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
aa30: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
aa40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
aa50: 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  TE";      break;
aa60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aa70: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20  TE_IOERR_NOMEM: 
aa80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
aa90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
aaa0: 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  EM";       break
aab0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aac0: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
aad0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
aae0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  "SQLITE_IOERR_AC
aaf0: 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61  CESS";      brea
ab00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ab10: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
ab20: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20  RESERVEDLOCK:.  
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
ab50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ab60: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
ab70: 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  DLOCK"; break;. 
ab80: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ab90: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20  _IOERR_LOCK:    
aba0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
abb0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22  LITE_IOERR_LOCK"
abc0: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
abd0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
abe0: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20  E_IOERR_CLOSE:  
abf0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ac00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
ac10: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
ac20: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ac30: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
ac40: 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  SE:    zName = "
ac50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
ac60: 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b  _CLOSE";   break
ac70: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ac80: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
ac90: 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  N:      zName = 
aca0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
acb0: 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61  MOPEN";     brea
acc0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
acd0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
ace0: 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ZE:      zName =
acf0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
ad00: 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65  HMSIZE";     bre
ad10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ad20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
ad30: 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  OCK:      zName 
ad40: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ad50: 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72  SHMLOCK";     br
ad60: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad70: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
ad80: 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  MAP:       zName
ad90: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ada0: 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62  _SHMMAP";      b
adb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
adc0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45   SQLITE_IOERR_SE
add0: 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  EK:         zNam
ade0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
adf0: 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20  R_SEEK";        
ae00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ae10: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
ae20: 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61  ELETE_NOENT: zNa
ae30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ae40: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22  RR_DELETE_NOENT"
ae50: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
ae60: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ae70: 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e  MMAP:         zN
ae80: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ae90: 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20  ERR_MMAP";      
aea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aeb0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
aec0: 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a  _GETTEMPPATH:  z
aed0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
aee0: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
aef0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
af00: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
af10: 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20  R_CONVPATH:     
af20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
af30: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b  IOERR_CONVPATH";
af40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
af50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
af60: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20  RUPT:           
af70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
af80: 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20  _CORRUPT";      
af90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
afa0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
afb0: 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20  RRUPT_VTAB:     
afc0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
afd0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b  E_CORRUPT_VTAB";
afe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aff0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
b000: 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20  OTFOUND:        
b010: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b020: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
b030: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b040: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b050: 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  FULL:           
b060: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b070: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
b080: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b090: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b0a0: 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20  _CANTOPEN:      
b0b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b0c0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
b0d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b0e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b0f0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
b100: 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  PDIR: zName = "S
b110: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
b120: 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b  OTEMPDIR";break;
b130: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b140: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
b150: 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  R:     zName = "
b160: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b170: 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b  ISDIR";    break
b180: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b190: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
b1a0: 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  LPATH:  zName = 
b1b0: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b1c0: 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61  _FULLPATH"; brea
b1d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b1e0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
b1f0: 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  NVPATH:  zName =
b200: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
b210: 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65  N_CONVPATH"; bre
b220: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b230: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
b240: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b250: 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  = "SQLITE_PROTOC
b260: 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  OL";          br
b270: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b280: 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20  SQLITE_EMPTY:   
b290: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b2a0: 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59   = "SQLITE_EMPTY
b2b0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
b2c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b2d0: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20   SQLITE_SCHEMA: 
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b2f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45  e = "SQLITE_SCHE
b300: 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  MA";            
b310: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b320: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b340: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f  me = "SQLITE_TOO
b350: 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  BIG";           
b360: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b370: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b380: 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e  AINT:         zN
b390: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b3a0: 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20  NSTRAINT";      
b3b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b3c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b3d0: 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a  RAINT_UNIQUE:  z
b3e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b3f0: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
b400: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b410: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b420: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20  TRAINT_TRIGGER: 
b430: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b440: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
b450: 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  ER";break;.     
b460: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b470: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
b480: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b4b0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
b4c0: 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72  OREIGNKEY";   br
b4d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b4e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b4f0: 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65  T_CHECK:   zName
b500: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b510: 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62  RAINT_CHECK";  b
b520: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b530: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b540: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20  NT_PRIMARYKEY:. 
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b570: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b580: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
b590: 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  YKEY";   break;.
b5a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b5b0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
b5c0: 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  NULL: zName = "S
b5d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b5e0: 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b  _NOTNULL";break;
b5f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b600: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
b610: 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20  MMITHOOK:.      
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b640: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b650: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22  AINT_COMMITHOOK"
b660: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
b670: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b680: 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20  STRAINT_VTAB:   
b690: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b6a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
b6b0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
b6c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b6d0: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
b6e0: 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N:.             
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b710: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
b720: 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65  NCTION";     bre
b730: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b740: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b750: 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20  _ROWID:   zName 
b760: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b770: 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72  AINT_ROWID";  br
b780: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b790: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a  SQLITE_MISMATCH:
b7a0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b7b0: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
b7c0: 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62  TCH";          b
b7d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b7e0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20   SQLITE_MISUSE: 
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b800: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
b810: 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SE";            
b820: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b830: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b850: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
b860: 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  FS";            
b870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b880: 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20  se SQLITE_AUTH: 
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b8a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
b8b0: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
b8c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b8d0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
b8e0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  T:             z
b8f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
b900: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20  ORMAT";         
b910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b920: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
b930: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
b940: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b950: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20  RANGE";         
b960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b970: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
b980: 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20  ADB:            
b990: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b9a0: 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20  _NOTADB";       
b9b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b9c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
b9d0: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
b9e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b9f0: 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20  E_ROW";         
ba00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
ba20: 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20  OTICE:          
ba30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ba40: 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20  TE_NOTICE";     
ba50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ba60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ba70: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
ba80: 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  AL: zName = "SQL
ba90: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
baa0: 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20  ER_WAL";break;. 
bab0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bac0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
bad0: 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20  ROLLBACK:.      
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bb00: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
bb10: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
bb20: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
bb30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
bb40: 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20  NING:           
bb50: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bb60: 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20  _WARNING";      
bb70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bb80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
bb90: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a  RNING_AUTOINDEX:
bba0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bbb0: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
bbc0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
bbd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
bbe0: 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ONE:            
bbf0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bc00: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
bc10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bc20: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e    }.  }.  if( zN
bc30: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ame==0 ){.    st
bc40: 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35  atic char zBuf[5
bc50: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
bc60: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
bc70: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51  zBuf), zBuf, "SQ
bc80: 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29  LITE_UNKNOWN(%d)
bc90: 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20  ", origRc);.    
bca0: 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20  zName = zBuf;.  
bcb0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
bcc0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
bcd0: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
bce0: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
bcf0: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
bd00: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
bd10: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
bd20: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
bd30: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
bd40: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
bd50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
bd60: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
bd70: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
bd80: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
bd90: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
bda0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
bdb0: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
bdc0: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
bdd0: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
bde0: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
bdf0: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
be00: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
be10: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
be20: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
be30: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
be40: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
be50: 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c  T       */ "call
be60: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
be70: 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20  uery abort",.   
be80: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
be90: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
bea0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
beb0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
bec0: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
bed0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
bee0: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
bef0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
bf00: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
bf10: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
bf20: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
bf30: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
bf40: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
bf50: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
bf60: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
bf70: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
bf80: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
bf90: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
bfa0: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
bfb0: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
bfc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
bfd0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
bfe0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
bff0: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
c000: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
c010: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
c020: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
c030: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
c040: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c050: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
c060: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c070: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
c080: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
c090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
c0a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
c0b0: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
c0c0: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
c0d0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
c0e0: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74  MPTY       */ "t
c0f0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  able contains no
c100: 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53   data",.    /* S
c110: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
c120: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
c130: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
c140: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c150: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
c160: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
c170: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
c180: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
c190: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
c1a0: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
c1b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
c1c0: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
c1d0: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
c1e0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
c1f0: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62  USE      */ "lib
c200: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
c210: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
c220: 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nce",.    /* SQL
c230: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
c240: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
c250: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
c260: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c270: 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a  TE_AUTH        *
c280: 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  / "authorization
c290: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
c2a0: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20   SQLITE_FORMAT  
c2b0: 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72      */ "auxiliar
c2c0: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  y database forma
c2d0: 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  t error",.    /*
c2e0: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20   SQLITE_RANGE   
c2f0: 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20      */ "bind or 
c300: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
c310: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
c320: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
c330: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
c340: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
c350: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
c360: 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ",.  };.  const 
c370: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e  char *zErr = "un
c380: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20  known error";.  
c390: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
c3a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
c3b0: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a  ORT_ROLLBACK: {.
c3c0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62        zErr = "ab
c3d0: 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42  ort due to ROLLB
c3e0: 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ACK";.      brea
c3f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
c400: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
c410: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
c420: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
c430: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
c440: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
c450: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
c460: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
c470: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
c480: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c490: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
c4a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c4b0: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
c4c0: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
c4d0: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
c4e0: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
c4f0: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
c500: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
c510: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
c520: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
c530: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
c540: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
c550: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
c560: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
c570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c580: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
c590: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64  yCallback(. void
c5a0: 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20   *ptr,          
c5b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c5c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c5d0: 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20  int count       
c5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c5f0: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c  er of times tabl
c600: 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20  e has been busy 
c610: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
c620: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
c630: 55 53 4c 45 45 50 0a 20 20 73 74 61 74 69 63 20  USLEEP.  static 
c640: 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b  const u8 delays[
c650: 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c  ] =.     { 1, 2,
c660: 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20   5, 10, 15, 20, 
c670: 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30  25, 25,  25,  50
c680: 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20  ,  50, 100 };.  
c690: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
c6a0: 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20  totals[] =.     
c6b0: 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31  { 0, 1, 3,  8, 1
c6c0: 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31  8, 33, 53, 78, 1
c6d0: 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32  03, 128, 178, 22
c6e0: 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44  8 };.# define ND
c6f0: 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64  ELAY ArraySize(d
c700: 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33  elays).  sqlite3
c710: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
c720: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
c730: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
c740: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
c750: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
c760: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
c770: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
c780: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
c790: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
c7a0: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
c7b0: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
c7c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
c7d0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
c7e0: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
c7f0: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
c800: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
c810: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
c820: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
c830: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
c840: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
c850: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
c860: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
c870: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
c880: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
c890: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
c8a0: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
c8b0: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
c8c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
c8d0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
c8e0: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
c8f0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
c900: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
c910: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
c920: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
c930: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c940: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
c950: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
c960: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
c970: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c980: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
c990: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
c9a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
c9b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
c9c0: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
c9d0: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
c9e0: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
c9f0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
ca00: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
ca10: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
ca20: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
ca30: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
ca40: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
ca50: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
ca60: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
ca70: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
ca80: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
ca90: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
caa0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
cab0: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
cac0: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
cad0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
cae0: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
caf0: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
cb00: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
cb10: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
cb20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
cb30: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
cb40: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
cb50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cb60: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
cb70: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
cb80: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
cb90: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
cba0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
cbb0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
cbc0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
cbd0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
cbe0: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
cbf0: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
cc00: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
cc10: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
cc20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cc30: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
cc40: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
cc50: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
cc60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
cc70: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
cc80: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
cc90: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
cca0: 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  ex);.  db->busyH
ccb0: 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78  andler.xFunc = x
ccc0: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
ccd0: 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70  Handler.pArg = p
cce0: 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  Arg;.  db->busyH
ccf0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
cd00: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  ;.  db->busyTime
cd10: 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  out = 0;.  sqlit
cd20: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
cd30: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
cd40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cd50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
cd60: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
cd70: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
cd80: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
cd90: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
cda0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
cdb0: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
cdc0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
cdd0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
cde0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
cdf0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67  gument. The prog
ce00: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  ress callback wi
ce10: 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ll.** be invoked
ce20: 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f   every nOps opco
ce30: 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  des..*/.void sql
ce40: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
ce50: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
ce60: 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70   *db, .  int nOp
ce70: 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67  s,.  int (*xProg
ce80: 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20  ress)(void*), . 
ce90: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
cea0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ceb0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
cec0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
ced0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
cee0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
cef0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
cf00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
cf10: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
cf20: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
cf30: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
cf40: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
cf50: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
cf60: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
cf70: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75  ProgressOps = (u
cf80: 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20  nsigned)nOps;.  
cf90: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
cfa0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c  rg = pArg;.  }el
cfb0: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f  se{.    db->xPro
cfc0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64  gress = 0;.    d
cfd0: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
cfe0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  = 0;.    db->pPr
cff0: 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20  ogressArg = 0;. 
d000: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
d010: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d020: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
d030: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d040: 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65  ne installs a de
d050: 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c  fault busy handl
d060: 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f  er that waits fo
d070: 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  r the.** specifi
d080: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  ed number of mil
d090: 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
d0a0: 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f   returning 0..*/
d0b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
d0c0: 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65  y_timeout(sqlite
d0d0: 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a  3 *db, int ms){.
d0e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d0f0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d100: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d110: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d120: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d130: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
d140: 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  if.  if( ms>0 ){
d150: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
d160: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
d170: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
d180: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
d190: 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73  db);.    db->bus
d1a0: 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20  yTimeout = ms;. 
d1b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
d1c0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
d1d0: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
d1e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d1f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
d200: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
d210: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
d220: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
d230: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
d240: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
d250: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
d260: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
d270: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
d280: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
d290: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
d2a0: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
d2b0: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
d2c0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
d2d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64  ;.  }.#endif.  d
d2e0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
d2f0: 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ted = 1;.}.../*.
d300: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d310: 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
d320: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
d330: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
d340: 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  ), except.** tha
d350: 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64  t it is designed
d360: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79   to be called by
d370: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20   internal code. 
d380: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
d390: 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d  s.** that if a m
d3a0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e  alloc() fails in
d3b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d3c0: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65  function(), an e
d3d0: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
d3e0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
d3f0: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
d400: 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a  ag cleared. .*/.
d410: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74  int sqlite3Creat
d420: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
d430: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
d440: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
d450: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
d460: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
d470: 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76   *pUserData,.  v
d480: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
d490: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
d4a0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
d4b0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
d4c0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
d4d0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
d4e0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
d4f0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
d500: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
d510: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
d520: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29  r *pDestructor.)
d530: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a  {.  FuncDef *p;.
d540: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69    int nName;.  i
d550: 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a  nt extraFlags;..
d560: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d570: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
d580: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
d590: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d   zFunctionName==
d5a0: 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e  0 ||.      (xFun
d5b0: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20  c && (xFinal || 
d5c0: 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20  xStep)) || .    
d5d0: 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46    (!xFunc && (xF
d5e0: 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29  inal && !xStep))
d5f0: 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e   ||.      (!xFun
d600: 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26  c && (!xFinal &&
d610: 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20   xStep)) ||.    
d620: 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41    (nArg<-1 || nA
d630: 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  rg>SQLITE_MAX_FU
d640: 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20  NCTION_ARG) ||. 
d650: 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65       (255<(nName
d660: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
d670: 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  30( zFunctionNam
d680: 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  e))) ){.    retu
d690: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
d6a0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73  _BKPT;.  }..  as
d6b0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
d6c0: 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49  C_CONSTANT==SQLI
d6d0: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
d6e0: 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73   );.  extraFlags
d6f0: 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45   = enc &  SQLITE
d700: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a  _DETERMINISTIC;.
d710: 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45    enc &= (SQLITE
d720: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51  _FUNC_ENCMASK|SQ
d730: 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69  LITE_ANY);.  .#i
d740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d750: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20  T_UTF16.  /* If 
d760: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
d770: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
d780: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
d790: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
d7a0: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
d7b0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
d7c0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
d7d0: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
d7e0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
d7f0: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
d800: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
d810: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
d820: 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45  *.  ** If SQLITE
d830: 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65  _ANY is specifie
d840: 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72  d, add three ver
d850: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e  sions of the fun
d860: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  ction.  ** to th
d870: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20  e hash table..  
d880: 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51  */.  if( enc==SQ
d890: 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20  LITE_UTF16 ){.  
d8a0: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
d8b0: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65  TF16NATIVE;.  }e
d8c0: 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  lse if( enc==SQL
d8d0: 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69  ITE_ANY ){.    i
d8e0: 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  nt rc;.    rc = 
d8f0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
d900: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
d910: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
d920: 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67  E_UTF8|extraFlag
d930: 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65  s,.         pUse
d940: 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53  rData, xFunc, xS
d950: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
d960: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69  structor);.    i
d970: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d980: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
d990: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
d9a0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
d9b0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
d9c0: 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c  _UTF16LE|extraFl
d9d0: 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ags,.          p
d9e0: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
d9f0: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
da00: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
da10: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
da20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
da30: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
da40: 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51    }.    enc = SQ
da50: 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20  LITE_UTF16BE;.  
da60: 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20  }.#else.  enc = 
da70: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e  SQLITE_UTF8;.#en
da80: 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63  dif.  .  /* Chec
da90: 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  k if an existing
daa0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
dab0: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72  ng overridden or
dac0: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c   deleted. If so,
dad0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20  .  ** and there 
dae0: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
daf0: 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  then return SQLI
db00: 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75  TE_BUSY. If a fu
db10: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62  nction.  ** is b
db20: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f  eing overridden/
db30: 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72  deleted but ther
db40: 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
db50: 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20  VMs, allow the. 
db60: 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f   ** operation to
db70: 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e   continue but in
db80: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
db90: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
dba0: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  nts..  */.  p = 
dbb0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
dbc0: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
dbd0: 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  nName, nName, nA
dbe0: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b  rg, (u8)enc, 0);
dbf0: 0a 20 20 69 66 28 20 70 20 26 26 20 28 70 2d 3e  .  if( p && (p->
dc00: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
dc10: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
dc20: 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67  ==enc && p->nArg
dc30: 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  ==nArg ){.    if
dc40: 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
dc50: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
dc60: 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
dc70: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
dc80: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
dc90: 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
dca0: 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20  y user-function 
dcb0: 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
dcc0: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
dcd0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
dce0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
dcf0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
dd00: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
dd10: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
dd20: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
dd30: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
dd40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20     }.  }..  p = 
dd50: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
dd60: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
dd70: 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  nName, nName, nA
dd80: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b  rg, (u8)enc, 1);
dd90: 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64  .  assert(p || d
dda0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
ddb0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
ddc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ddd0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
dde0: 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72   If an older ver
ddf0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63  sion of the func
de00: 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66  tion with a conf
de10: 69 67 75 72 65 64 20 64 65 73 74 72 75 63 74 6f  igured destructo
de20: 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20  r is.  ** being 
de30: 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20  replaced invoke 
de40: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
de50: 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f  unction here. */
de60: 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72  .  functionDestr
de70: 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66  oy(db, p);..  if
de80: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
de90: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
dea0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
deb0: 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20 3d  p->pDestructor =
dec0: 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20   pDestructor;.  
ded0: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28  p->funcFlags = (
dee0: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
def0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
df00: 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73  SK) | extraFlags
df10: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d  ;.  testcase( p-
df20: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
df30: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
df40: 43 20 29 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20  C );.  p->xFunc 
df50: 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53  = xFunc;.  p->xS
df60: 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70  tep = xStep;.  p
df70: 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46  ->xFinalize = xF
df80: 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72  inal;.  p->pUser
df90: 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61  Data = pUserData
dfa0: 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75  ;.  p->nArg = (u
dfb0: 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72  16)nArg;.  retur
dfc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
dfd0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77  /*.** Create new
dfe0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e   user functions.
dff0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e000: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
e010: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
e020: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e030: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
e040: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
e050: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
e060: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
e070: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
e080: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
e090: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
e0a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e0b0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e0c0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
e0d0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
e0e0: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72  context*).){.  r
e0f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
e100: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
e110: 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67  (db, zFunc, nArg
e120: 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c  , enc, p, xFunc,
e130: 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20   xStep,.        
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e              xFin
e160: 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73  al, 0);.}..int s
e170: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e180: 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  nction_v2(.  sql
e190: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e1a0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
e1b0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e1c0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
e1d0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
e1e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e1f0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e200: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e210: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
e220: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e230: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e240: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
e250: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e260: 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44  t*),.  void (*xD
e270: 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a  estroy)(void *).
e280: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e290: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75  LITE_ERROR;.  Fu
e2a0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41  ncDestructor *pA
e2b0: 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  rg = 0;..#ifdef 
e2c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e2d0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
e2e0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
e2f0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
e300: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
e310: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
e320: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
e330: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
e340: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
e350: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
e360: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
e370: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
e380: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
e390: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
e3a0: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
e3b0: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
e3c0: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
e3d0: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
e3e0: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
e3f0: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
e400: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
e410: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
e420: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
e430: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
e440: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
e450: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
e460: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
e470: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
e480: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
e490: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e4a0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
e4b0: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
e4c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e4d0: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
e4e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
e4f0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
e500: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e510: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
e520: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e530: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e540: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
e550: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e560: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
e570: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e580: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
e590: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
e5a0: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
e5b0: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
e5c0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
e5d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e5e0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e5f0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
e600: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
e610: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e620: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
e630: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
e640: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
e650: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
e660: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66  ar *zFunc8;..#if
e670: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e680: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
e690: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
e6a0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
e6b0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
e6c0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e6d0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
e6e0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
e6f0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e700: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
e710: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
e720: 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20  d );.  zFunc8 = 
e730: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
e740: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
e750: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
e760: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63  F16NATIVE);.  rc
e770: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
e780: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c  Func(db, zFunc8,
e790: 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c   nArg, eTextRep,
e7a0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
e7b0: 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73  , xFinal,0);.  s
e7c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e7d0: 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d   zFunc8);.  rc =
e7e0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e7f0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
e800: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e810: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e820: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e830: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  .../*.** Declare
e840: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
e850: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f   has been overlo
e860: 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61  aded by a virtua
e870: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
e880: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61  f the function a
e890: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73  lready exists as
e8a0: 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61   a regular globa
e8b0: 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  l function, then
e8c0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
e8d0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
e8e0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
e8f0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
e900: 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e  en create.** a n
e910: 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61  ew one that alwa
e920: 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d  ys throws a run-
e930: 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a  time error.  .**
e940: 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c  .** When virtual
e950: 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74   tables intend t
e960: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65  o provide an ove
e970: 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e  rloaded function
e980: 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  , they.** should
e990: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
e9a0: 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
e9b0: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
e9c0: 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41  ion exists..** A
e9d0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
e9e0: 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f   must exist in o
e9f0: 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65  rder for name re
ea00: 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  solution to work
ea10: 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  .** properly..*/
ea20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65  .int sqlite3_ove
ea30: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a  rload_function(.
ea40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
ea50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ea60: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29  me,.  int nArg.)
ea70: 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  {.  int nName = 
ea80: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ea90: 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63  zName);.  int rc
eaa0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
eab0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
eac0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
ead0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
eae0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
eaf0: 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72   zName==0 || nAr
eb00: 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  g<-2 ){.    retu
eb10: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
eb20: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
eb30: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
eb40: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
eb50: 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  x);.  if( sqlite
eb60: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
eb70: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
eb80: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
eb90: 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  8, 0)==0 ){.    
eba0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
ebb0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65  teFunc(db, zName
ebc0: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
ebd0: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TF8,.           
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  0, sqlite3Invali
ec00: 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  dFunction, 0, 0,
ec10: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   0);.  }.  rc = 
ec20: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
ec30: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
ec40: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
ec50: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
ec60: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
ec70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
ec80: 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ACE./*.** Regist
ec90: 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74  er a trace funct
eca0: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
ecb0: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
ecc0: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72  ly registered tr
ecd0: 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ace.** is return
ece0: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
ecf0: 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f  LL trace functio
ed00: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
ed10: 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75  tracing is execu
ed20: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
ed30: 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70  .** trace is a p
ed40: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
ed50: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
ed60: 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72  oked at the star
ed70: 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c  t of each.** SQL
ed80: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
ed90: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61  oid *sqlite3_tra
eda0: 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ce(sqlite3 *db, 
edb0: 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28 76  void (*xTrace)(v
edc0: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
edd0: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
ede0: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
edf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ee00: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
ee10: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
ee20: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
ee30: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
ee40: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
ee50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ee60: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
ee70: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ee80: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
ee90: 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67   = db->pTraceArg
eea0: 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
eeb0: 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70   xTrace;.  db->p
eec0: 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
eed0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
eee0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
eef0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
ef00: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ;.}./*.** Regist
ef10: 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e  er a profile fun
ef20: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
ef30: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
ef40: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
ef50: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  .** profile func
ef60: 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
ef70: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
ef80: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
ef90: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
efa0: 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65  profiling is exe
efb0: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
efc0: 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73  LL.** profile is
efd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
efe0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
eff0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
f000: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a  conclusion of.**
f010: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
f020: 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e  ent that is run.
f030: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
f040: 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c  3_profile(.  sql
f050: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
f060: 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69   (*xProfile)(voi
f070: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  d*,const char*,s
f080: 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20  qlite_uint64),. 
f090: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
f0a0: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69   void *pOld;..#i
f0b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f0c0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
f0d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f0e0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
f0f0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
f100: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f110: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f120: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f130: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f140: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
f150: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
f160: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
f170: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
f180: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
f190: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
f1a0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
f1b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
f1c0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
f1d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f1e0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
f1f0: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
f200: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
f210: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
f220: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
f230: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
f240: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
f250: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
f260: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
f270: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
f280: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
f290: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
f2a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f2c0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
f2d0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
f2e0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
f2f0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
f300: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
f310: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
f320: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
f330: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
f340: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
f350: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
f360: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
f370: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
f380: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f390: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f3a0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f3b0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
f3c0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
f3d0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
f3e0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
f3f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f400: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f410: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f    pOld = db->pCo
f420: 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78  mmitArg;.  db->x
f430: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d  CommitCallback =
f440: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
f450: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70  ->pCommitArg = p
f460: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
f470: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f480: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f490: 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pOld;.}../*.** R
f4a0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
f4b0: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
f4c0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
f4d0: 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
f4e0: 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
f4f0: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
f500: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
f510: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
f520: 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
f530: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f550: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
f560: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
f570: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
f580: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
f590: 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c  nt,char const *,
f5a0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c  char const *,sql
f5b0: 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  ite_int64),.  vo
f5c0: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
f5d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
f5e0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
f5f0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
f600: 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20   *pRet;..#ifdef 
f610: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f620: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f630: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f640: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
f650: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
f660: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
f670: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
f680: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f690: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f6a0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
f6b0: 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  >pUpdateArg;.  d
f6c0: 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
f6d0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
f6e0: 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67    db->pUpdateArg
f6f0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
f700: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f710: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f720: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
f730: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
f740: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
f750: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
f760: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f770: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62  rolled.** back b
f780: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
f790: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
f7a0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c  oid *sqlite3_rol
f7b0: 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71  lback_hook(.  sq
f7c0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
f7d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
f7e0: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
f7f0: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
f800: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
f810: 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61  k)(void*), /* Ca
f820: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
f830: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f850: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
f860: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
f870: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a  .  void *pRet;..
f880: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f890: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
f8a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
f8b0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
f8c0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
f8d0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f8e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f8f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
f900: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f910: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
f920: 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
f930: 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
f940: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
f950: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
f960: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
f970: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
f980: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f990: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f9a0: 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pRet;.}..#ifnde
f9b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
f9c0: 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  L./*.** The sqli
f9d0: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
f9e0: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
f9f0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61  ed by sqlite3_wa
fa00: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
fa10: 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71  ()..** Invoke sq
fa20: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
fa30: 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62  oint if the numb
fa40: 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20  er of frames in 
fa50: 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20  the log file.** 
fa60: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
fa70: 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20  sqlite3.pWalArg 
fa80: 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
fa90: 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f  er (the value co
faa0: 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77  nfigured by.** w
fab0: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
fac0: 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  t())..*/ .int sq
fad0: 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
fae0: 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  ook(.  void *pCl
faf0: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a  ientData,     /*
fb00: 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73   Argument */.  s
fb10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
fb20: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
fb30: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
fb40: 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
fb50: 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  /* Database */. 
fb60: 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20   int nFrame     
fb70: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
fb80: 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69  of WAL */.){.  i
fb90: 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54  f( nFrame>=SQLIT
fba0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c  E_PTR_TO_INT(pCl
fbb0: 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20  ientData) ){.   
fbc0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
fbd0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
fbe0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
fbf0: 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29  ckpoint(db, zDb)
fc00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
fc10: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
fc20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
fc30: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
fc40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fc50: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  WAL */../*.** Co
fc60: 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74  nfigure an sqlit
fc70: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
fc80: 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61  llback to automa
fc90: 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
fca0: 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  nt.** a database
fcb0: 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e   after committin
fcc0: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
fcd0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72  if there are nFr
fce0: 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66  ame or.** more f
fcf0: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
fd00: 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a   file. Passing z
fd10: 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76  ero or a negativ
fd20: 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a  e value as the.*
fd30: 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74  * nFrame paramet
fd40: 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f  er disables auto
fd50: 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
fd60: 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a  s entirely..**.*
fd70: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  * The callback r
fd80: 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69  egistered by thi
fd90: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61  s function repla
fda0: 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ces any existing
fdb0: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67   callback.** reg
fdc0: 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71  istered using sq
fdd0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
fde0: 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69  . Likewise, regi
fdf0: 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61  stering a callba
fe00: 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  ck.** using sqli
fe10: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64  te3_wal_hook() d
fe20: 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f  isables the auto
fe30: 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
fe40: 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f   mechanism.** co
fe50: 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73  nfigured by this
fe60: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
fe70: 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  t sqlite3_wal_au
fe80: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  tocheckpoint(sql
fe90: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46  ite3 *db, int nF
fea0: 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51  rame){.#ifdef SQ
feb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
fec0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
fed0: 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (db);.  UNUSED_P
fee0: 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29  ARAMETER(nFrame)
fef0: 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53  ;.#else.#ifdef S
ff00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
ff10: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
ff20: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
ff30: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
ff40: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
ff50: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
ff60: 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20   nFrame>0 ){.   
ff70: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
ff80: 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c  k(db, sqlite3Wal
ff90: 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c  DefaultHook, SQL
ffa0: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
ffb0: 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  Frame));.  }else
ffc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
ffd0: 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29  l_hook(db, 0, 0)
ffe0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
fff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
10010 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
10020 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
10030 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
10040 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ion is written.*
10050 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65  * into the write
10060 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68  -ahead-log by th
10070 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
10080 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
10090 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f  *sqlite3_wal_hoo
100a0 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
100b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
100c0 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
100d0 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
100e0 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
100f0 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  nt(*xCallback)(v
10100 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  oid *, sqlite3*,
10110 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
10120 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
10150 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
10160 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
10170 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
10180 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f  TE_OMIT_WAL.  vo
10190 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66  id *pRet;.#ifdef
101a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
101b0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
101c0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
101d0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
101e0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
101f0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
10200 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
10210 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
10220 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
10230 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
10240 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d  ->pWalArg;.  db-
10250 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20  >xWalCallback = 
10260 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
10270 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b  >pWalArg = pArg;
10280 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10290 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
102a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
102b0 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
102c0 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
102d0 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
102e0 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a  atabase zDb..*/.
102f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
10300 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20  checkpoint_v2(. 
10310 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
10340 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
10350 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
10360 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
10370 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
10380 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20  abase (or NULL) 
10390 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20  */.  int eMode, 
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43       /* SQLITE_C
103c0 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75  HECKPOINT_* valu
103d0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f  e */.  int *pnLo
103e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
103f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
10400 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69  ize of WAL log i
10410 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  n frames */.  in
10420 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20  t *pnCkpt       
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10440 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62   OUT: Total numb
10450 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65  er of frames che
10460 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a  ckpointed */.){.
10470 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
10480 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20  IT_WAL.  return 
10490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
104a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
104d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  e */.  int iDb =
104e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
104f0 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65  CHED;  /* sqlite
10500 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66  3.aDb[] index of
10510 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e   db to checkpoin
10520 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  t */..#ifdef SQL
10530 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10540 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
10550 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
10560 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
10570 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
10580 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
10590 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75  nitialize the ou
105a0 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74  tput variables t
105b0 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20  o -1 in case an 
105c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
105d0 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a  .  if( pnLog ) *
105e0 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66  pnLog = -1;.  if
105f0 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b  ( pnCkpt ) *pnCk
10600 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65  pt = -1;..  asse
10610 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
10620 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30  POINT_PASSIVE==0
10630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
10640 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
10650 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73  FULL==1 );.  ass
10660 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
10670 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d  KPOINT_RESTART==
10680 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
10690 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
106a0 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a  _TRUNCATE==3 );.
106b0 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49    if( eMode<SQLI
106c0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
106d0 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53  SSIVE || eMode>S
106e0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
106f0 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
10700 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10710 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54   R-03996-12088 T
10720 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d  he M parameter m
10730 75 73 74 20 62 65 20 61 20 76 61 6c 69 64 20 63  ust be a valid c
10740 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a  heckpoint.    **
10750 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65   mode: */.    re
10760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
10770 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
10780 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10790 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
107a0 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
107b0 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
107c0 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
107d0 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
107e0 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
107f0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
10800 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
10810 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
10820 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
10830 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
10840 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
10850 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48  e{.    db->busyH
10860 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
10870 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
10880 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
10890 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c   iDb, eMode, pnL
108a0 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
108b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
108c0 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20  , rc);.  }.  rc 
108d0 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
108e0 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
108f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10900 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10910 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
10920 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  }.../*.** Checkp
10930 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
10940 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c  b. If zDb is NUL
10950 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66  L, or if the buf
10960 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a  fer zDb points.*
10970 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20  * to contains a 
10980 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69  zero-length stri
10990 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64  ng, all attached
109a0 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a   databases are .
109b0 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
109c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
109d0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73  wal_checkpoint(s
109e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
109f0 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
10a00 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
10a10 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54 68  R-41613-20553 Th
10a20 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
10a30 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69 73  eckpoint(D,X) is
10a40 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
10a50 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   ** sqlite3_wal_
10a60 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c  checkpoint_v2(D,
10a70 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  X,SQLITE_CHECKPO
10a80 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29  INT_PASSIVE,0,0)
10a90 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71  . */.  return sq
10aa0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
10ab0 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53  oint_v2(db,zDb,S
10ac0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10ad0 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d  _PASSIVE,0,0);.}
10ae0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10af0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
10b00 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  Run a checkpoint
10b10 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   on database iDb
10b20 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
10b30 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44  p if database iD
10b40 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  b is.** not curr
10b50 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41  ently open in WA
10b60 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L mode..**.** If
10b70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
10b80 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
10b90 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65  tabase being che
10ba0 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20  ckpointed, this 
10bb0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
10bc0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
10bd0 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f  ED and a checkpo
10be0 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  int is not attem
10bf0 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  pted. If .** an 
10c00 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
10c10 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  le running the c
10c20 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51  heckpoint, an SQ
10c30 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
10c40 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
10c50 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (i.e. SQLITE_IOE
10c60 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  RR). Otherwise, 
10c70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
10c80 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   The mutex on da
10c90 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
10ca0 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
10cb0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  by the caller. T
10cc0 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f  he mutex.** asso
10cd0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
10ce0 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20  specific b-tree 
10cf0 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
10d00 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a  ed is taken by.*
10d10 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
10d20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70  while the checkp
10d30 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  oint is running.
10d40 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73  .**.** If iDb is
10d50 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d   passed SQLITE_M
10d60 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65  AX_ATTACHED, the
10d70 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
10d80 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20  atabases are.** 
10d90 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66  checkpointed. If
10da0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
10db0 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72  ountered it is r
10dc0 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
10dd0 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65  ely -.** no atte
10de0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
10df0 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65  heckpoint any re
10e00 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65  maining database
10e10 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  s..**.** Paramet
10e20 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20  er eMode is one 
10e30 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  of SQLITE_CHECKP
10e40 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55  OINT_PASSIVE, FU
10e50 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a  LL or RESTART..*
10e60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
10e70 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
10e80 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
10e90 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e  t eMode, int *pn
10ea0 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74  Log, int *pnCkpt
10eb0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10ec0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
10ed0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10ee0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
10f10 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
10f20 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73  ugh attached dbs
10f30 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20   */.  int bBusy 
10f40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10f50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10f60 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73   SQLITE_BUSY has
10f70 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
10f80 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
10f90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10fa0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
10fb0 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f  .  assert( !pnLo
10fc0 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20  g || *pnLog==-1 
10fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
10fe0 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d  Ckpt || *pnCkpt=
10ff0 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  =-1 );..  for(i=
11000 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20  0; i<db->nDb && 
11010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
11020 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
11030 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49  iDb || iDb==SQLI
11040 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
11050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
11060 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70  lite3BtreeCheckp
11070 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  oint(db->aDb[i].
11080 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  pBt, eMode, pnLo
11090 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
110a0 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20    pnLog = 0;.   
110b0 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20     pnCkpt = 0;. 
110c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
110d0 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
110e0 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20      bBusy = 1;. 
110f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11100 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
11110 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
11120 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
11130 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51  K && bBusy) ? SQ
11140 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a  LITE_BUSY : rc;.
11150 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11160 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
11170 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11180 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65  ion returns true
11190 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20   if main-memory 
111a0 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69  should be used i
111b0 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74  nstead of.** a t
111c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f  emporary file fo
111d0 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65  r transient page
111e0 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74  r files and stat
111f0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  ement journals..
11200 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
11210 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  urned depends on
11220 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62   the value of db
11230 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75  ->temp_store (ru
11240 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74  ntime.** paramet
11250 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  er) and the comp
11260 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f  ile time value o
11270 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
11280 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ORE. The.** foll
11290 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
112a0 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69  ribes the relati
112b0 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74  onship between t
112c0 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a  hese two values.
112d0 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ** and this func
112e0 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c  tions return val
112f0 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49  ue..**.**   SQLI
11300 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20  TE_TEMP_STORE   
11310 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
11320 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66       Location of
11330 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
11340 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ase.**   -------
11350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
11360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
11370 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
11380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11390 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
113a0 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
113c0 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
113d0 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
11410 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
11440 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
11450 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31  return 1).**   1
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
11480 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
11490 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
114a0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
114b0 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
114c0 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
114d0 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
114e0 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
114f0 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
11510 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
11520 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  1).**   2       
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
11560 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20  rn 1).**   3    
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11580 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
11590 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
115a0 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20  eturn 1).*/.int 
115b0 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
115c0 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65  ory(const sqlite
115d0 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49  3 *db){.#if SQLI
115e0 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31  TE_TEMP_STORE==1
115f0 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
11600 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b  temp_store==2 );
11610 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
11620 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
11630 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
11640 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b  temp_store!=1 );
11650 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
11660 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33  TE_TEMP_STORE==3
11670 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11680 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72  TER(db);.  retur
11690 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
116a0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
116b0 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
116c0 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55  MP_STORE>3.  UNU
116d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
116e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  );.  return 0;.#
116f0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
11700 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f  eturn UTF-8 enco
11710 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
11720 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
11730 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
11740 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
11750 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
11760 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69  ite3_errmsg(sqli
11770 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
11780 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28  t char *z;.  if(
11790 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
117a0 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
117b0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
117c0 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
117d0 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
117e0 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
117f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
11800 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53  rrStr(SQLITE_MIS
11810 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  USE_BKPT);.  }. 
11820 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11830 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11840 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11850 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
11860 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
11870 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
11880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73    }else{.    tes
11890 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d  tcase( db->pErr=
118a0 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63  =0 );.    z = (c
118b0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
118c0 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72  ue_text(db->pErr
118d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
118e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
118f0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30   );.    if( z==0
11900 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
11910 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
11920 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  errCode);.    }.
11930 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
11940 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11950 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
11960 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
11970 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
11980 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
11990 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  16 encoded Engli
119a0 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
119b0 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
119c0 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
119d0 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  ror..*/.const vo
119e0 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  id *sqlite3_errm
119f0 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62  sg16(sqlite3 *db
11a00 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
11a10 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d  t u16 outOfMem[]
11a20 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75   = {.    'o', 'u
11a30 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27  ', 't', ' ', 'o'
11a40 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c  , 'f', ' ', 'm',
11a50 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20   'e', 'm', 'o', 
11a60 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b  'r', 'y', 0.  };
11a70 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
11a80 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b  u16 misuse[] = {
11a90 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27  .    'l', 'i', '
11aa0 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72  b', 'r', 'a', 'r
11ab0 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'y', ' ', .  
11ac0 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c    'r', 'o', 'u',
11ad0 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20   't', 'i', 'n', 
11ae0 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'e', ' ', .    '
11af0 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c  c', 'a', 'l', 'l
11b00 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27  ', 'e', 'd', ' '
11b10 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c  , .    'o', 'u',
11b20 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   't', ' ', .    
11b30 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a  'o', 'f', ' ', .
11b40 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71      's', 'e', 'q
11b50 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27  ', 'u', 'e', 'n'
11b60 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20  , 'c', 'e', 0.  
11b70 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  };..  const void
11b80 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
11b90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
11ba0 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
11bb0 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
11bc0 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
11bd0 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
11be0 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d  return (void *)m
11bf0 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  isuse;.  }.  sql
11c00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11c10 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
11c20 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
11c30 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28  led ){.    z = (
11c40 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
11c50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
11c60 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
11c70 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
11c80 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
11c90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11ca0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
11cb0 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c  db->errCode, sql
11cc0 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
11cd0 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  rrCode));.      
11ce0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
11cf0 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
11d00 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  r);.    }.    /*
11d10 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
11d20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
11d30 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
11d40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11d50 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  t16().    ** abo
11d60 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ve. If this is t
11d70 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
11d80 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
11d90 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f  ed flag needs to
11da0 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72  .    ** be clear
11db0 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
11dc0 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72  ing. Do this dir
11dd0 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
11de0 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c  f via.    ** sql
11df0 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74  ite3ApiExit(), t
11e00 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20  o avoid setting 
11e10 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
11e20 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  dle error messag
11e30 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62  e..    */.    db
11e40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
11e50 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
11e60 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11e70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
11e80 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
11e90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
11ea0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
11eb0 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
11ec0 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
11ed0 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
11ee0 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20  SQLite routine. 
11ef0 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61  If NULL is.** pa
11f00 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
11f10 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65  ction, we assume
11f20 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
11f30 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  ed during sqlite
11f40 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  3_open()..*/.int
11f50 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
11f60 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
11f70 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
11f80 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
11f90 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
11fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11fb0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
11fc0 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
11fd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11fe0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11ff0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
12000 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
12010 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
12020 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  k;.}.int sqlite3
12030 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
12040 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
12050 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
12060 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
12070 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
12080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12090 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
120a0 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
120b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
120c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
120d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
120e0 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
120f0 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Code;.}../*.** R
12100 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
12110 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
12120 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
12130 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
12140 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46  .** argument.  F
12150 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d  or now, this sim
12160 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e  ply calls the in
12170 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72  ternal sqlite3Er
12180 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rStr().** functi
12190 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
121a0 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74  r *sqlite3_errst
121b0 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74  r(int rc){.  ret
121c0 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
121d0 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r(rc);.}../*.** 
121e0 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c  Create a new col
121f0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
12200 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62  for database "db
12210 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20  ".  The name is 
12220 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65  zName.** and the
12230 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63   encoding is enc
12240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12250 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
12260 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a  .  sqlite3* db,.
12270 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
12280 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a  ame, .  u8 enc,.
12290 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
122a0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
122b0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
122c0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
122d0 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
122e0 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
122f0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
12300 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a  .  int enc2;.  .
12310 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12320 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
12330 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
12340 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
12350 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
12360 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
12370 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
12380 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
12390 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
123a0 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
123b0 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
123c0 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
123d0 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
123e0 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
123f0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
12400 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65  .  */.  enc2 = e
12410 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  nc;.  testcase( 
12420 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
12430 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  16 );.  testcase
12440 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
12450 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a  TF16_ALIGNED );.
12460 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49    if( enc2==SQLI
12470 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32  TE_UTF16 || enc2
12480 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
12490 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e  LIGNED ){.    en
124a0 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  c2 = SQLITE_UTF1
124b0 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69  6NATIVE;.  }.  i
124c0 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55  f( enc2<SQLITE_U
124d0 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49  TF8 || enc2>SQLI
124e0 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20  TE_UTF16BE ){.  
124f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12500 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
12510 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
12520 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d  this call is rem
12530 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69  oving or replaci
12540 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63  ng an existing c
12550 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73  ollation .  ** s
12560 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20  equence. If so, 
12570 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
12580 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e  tive VMs, return
12590 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a   busy. If there.
125a0 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69    ** are no acti
125b0 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61  ve VMs, invalida
125c0 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69  te any pre-compi
125d0 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
125e0 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    */.  pColl = s
125f0 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
12600 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
12610 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  zName, 0);.  if(
12620 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
12630 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28  >xCmp ){.    if(
12640 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
12650 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12660 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
12670 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
12680 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
12690 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
126a0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
126b0 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76  nce due to activ
126c0 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
126d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
126e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
126f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
12700 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
12710 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nts(db);..    /*
12720 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
12730 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
12740 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
12750 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
12760 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
12770 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
12780 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
12790 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
127a0 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
127b0 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
127c0 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
127d0 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
127e0 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
127f0 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
12800 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
12810 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
12820 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
12830 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
12840 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
12850 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
12860 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
12870 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
12880 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
12890 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
128a0 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
128b0 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
128c0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
128d0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
128e0 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
128f0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
12900 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
12910 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
12920 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
12930 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
12940 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
12950 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
12960 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
12970 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
12980 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
12990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
129a0 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
129b0 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
129c0 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
129d0 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
129e0 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
129f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12a00 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
12a10 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
12a20 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
12a30 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
12a40 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
12a50 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
12a60 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
12a70 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
12a80 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
12a90 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
12aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12ab0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
12ac0 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73  is array defines
12ad0 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
12ae0 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75  ds on limit valu
12af0 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74  es.  The.** init
12b00 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20  ializer must be 
12b10 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74  kept in sync wit
12b20 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  h the SQLITE_LIM
12b30 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73  IT_*.** #defines
12b40 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a   in sqlite3.h..*
12b50 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
12b60 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20  nt aHardLimit[] 
12b70 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  = {.  SQLITE_MAX
12b80 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
12b90 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
12ba0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
12bb0 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f  OLUMN,.  SQLITE_
12bc0 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a  MAX_EXPR_DEPTH,.
12bd0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d    SQLITE_MAX_COM
12be0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20  POUND_SELECT,.  
12bf0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
12c00 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  OP,.  SQLITE_MAX
12c10 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20  _FUNCTION_ARG,. 
12c20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
12c30 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  CHED,.  SQLITE_M
12c40 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
12c50 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
12c60 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
12c70 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d  MBER,      /* IM
12c80 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32  P: R-38091-32352
12c90 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58   */.  SQLITE_MAX
12ca0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a  _TRIGGER_DEPTH,.
12cb0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52    SQLITE_MAX_WOR
12cc0 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a  KER_THREADS,.};.
12cd0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
12ce0 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
12cf0 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
12d00 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
12d10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12d20 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
12d30 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
12d40 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
12d50 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
12d60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12d70 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
12d80 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
12d90 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
12da0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
12db0 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
12dc0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
12dd0 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
12de0 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
12df0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
12e00 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
12e10 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
12e20 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
12e30 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12e40 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
12e50 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
12e60 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
12e70 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
12e80 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
12e90 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
12ea0 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
12eb0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
12ec0 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
12ed0 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
12ee0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
12ef0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
12f00 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
12f10 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30  UNCTION_ARG>1000
12f20 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
12f30 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
12f40 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
12f50 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64   0 and 1000.#end
12f60 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
12f70 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
12f80 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
12f90 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20  HED>125.# error 
12fa0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
12fb0 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77  HED must be betw
12fc0 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65  een 0 and 125.#e
12fd0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12fe0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
12ff0 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f  _LENGTH<1.# erro
13000 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  r SQLITE_MAX_LIK
13010 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
13020 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13030 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
13040 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
13050 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53  >32767.# error S
13060 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
13070 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64   must not exceed
13080 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69   32767.#endif.#i
13090 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  f SQLITE_MAX_TRI
130a0 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65  GGER_DEPTH<1.# e
130b0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
130c0 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75  TRIGGER_DEPTH mu
130d0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
130e0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
130f0 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
13100 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54  READS<0 || SQLIT
13110 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13120 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20  EADS>50.# error 
13130 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
13140 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62  R_THREADS must b
13150 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
13160 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  50.#endif.../*.*
13170 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
13180 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
13190 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
131a0 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
131b0 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
131c0 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
131d0 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
131e0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
131f0 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
13200 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
13210 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
13220 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
13230 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
13240 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
13250 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
13260 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
13270 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
13280 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
13290 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
132a0 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
132b0 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
132c0 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
132d0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
132e0 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
132f0 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
13300 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  mit;..#ifdef SQL
13310 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
13320 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
13330 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
13340 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
13350 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
13360 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
13370 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
13380 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
13390 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
133a0 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
133b0 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
133c0 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
133d0 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
133e0 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
133f0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
13400 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
13410 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
13420 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
13430 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
13440 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
13450 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
13460 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
13470 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
13480 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13490 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
134a0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
134b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
134c0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
134d0 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
134e0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
134f0 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
13500 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13510 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
13520 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
13530 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
13540 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13550 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
13560 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
13570 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
13580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
13590 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
135a0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
135b0 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
135c0 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
135d0 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
135e0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
135f0 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
13600 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
13610 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
13620 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13630 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
13640 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
13650 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
13660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13670 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13680 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
13690 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
136a0 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
136b0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
136c0 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
136d0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13710 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
13720 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
13730 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13740 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13750 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
13760 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
13770 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
13780 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13790 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
137a0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
137b0 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
137c0 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
137d0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
137e0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
137f0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
13800 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  ]==SQLITE_MAX_WO
13810 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a  RKER_THREADS );.
13820 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
13830 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
13840 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e  READS==(SQLITE_N
13850 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
13860 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
13870 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
13880 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
13890 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
138a0 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
138b0 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
138c0 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
138d0 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
138e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
138f0 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
13900 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
13910 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
13920 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
13930 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
13940 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
13950 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
13960 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
13970 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
13980 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
13990 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
139a0 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
139c0 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
139d0 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
139e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
139f0 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
13a00 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
13a10 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
13a20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
13a30 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
13a40 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
13a50 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
13a60 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
13a70 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
13a80 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
13a90 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
13aa0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
13ab0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
13ac0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
13ad0 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
13ae0 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
13af0 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
13b00 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
13b10 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
13b20 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
13b30 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
13b40 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
13b50 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
13b60 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
13b70 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
13b80 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
13b90 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
13ba0 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
13bb0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
13bc0 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
13bd0 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
13be0 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
13bf0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
13c00 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
13c10 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
13c20 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
13c30 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
13c40 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
13c50 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
13c60 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
13c70 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
13c80 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
13c90 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
13ca0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
13cb0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
13cc0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
13cd0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
13ce0 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
13cf0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
13d00 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
13d10 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
13d20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13d30 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
13d40 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
13d50 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
13d60 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
13d70 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
13d80 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
13d90 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
13da0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
13db0 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
13dc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
13dd0 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
13de0 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
13df0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
13e00 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
13e10 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
13e20 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
13e30 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
13e40 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
13e50 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
13e60 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
13e70 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
13e80 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
13e90 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
13ea0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
13eb0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
13ec0 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
13ed0 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
13ee0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
13ef0 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
13f00 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
13f10 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
13f20 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
13f30 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
13f40 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
13f50 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
13f60 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13f80 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
13f90 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
13fa0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
13fb0 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
13fc0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
13fd0 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
13fe0 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
13ff0 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
14000 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
14010 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
14020 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
14050 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
14060 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
14070 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
14080 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
14090 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
140a0 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
140b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
140c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
140d0 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
140e0 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
140f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
14100 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
14110 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
14120 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
14130 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
14140 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
14150 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
14160 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
14170 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
14180 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20  PEN_URI)        
14190 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
141a0 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20  8725-32206 */.  
141b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
141c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
141d0 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d  .bOpenUri) /* IM
141e0 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38  P: R-51689-46548
141f0 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d   */.   && nUri>=
14200 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69  5 && memcmp(zUri
14210 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30  , "file:", 5)==0
14220 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34   /* IMP: R-57884
14230 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20  -37496 */.  ){. 
14240 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20     char *zOpt;. 
14250 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20     int eState;  
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65   /* Parser state
14280 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52   when parsing UR
14290 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e  I */.    int iIn
142a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
142b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
142c0 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
142d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  */.    int iOut 
142e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
142f0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
14300 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
14310 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20  /.    u64 nByte 
14320 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20  = nUri+2;       
14330 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
14340 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
14350 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  e */..    /* Mak
14360 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54  e sure the SQLIT
14370 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
14380 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
14390 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f  te to the VFS xO
143a0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68  pen .    ** meth
143b0 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61  od that there ma
143c0 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d  y be extra param
143d0 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eters following 
143e0 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20  the file-name.  
143f0 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  */.    flags |= 
14400 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
14410 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b  ..    for(iIn=0;
14420 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b   iIn<nUri; iIn++
14430 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69  ) nByte += (zUri
14440 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20  [iIn]=='&');.   
14450 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
14460 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
14470 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65  ;.    if( !zFile
14480 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14490 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e  _NOMEM;..    iIn
144a0 20 3d 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 5;.#ifdef SQL
144b0 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55  ITE_ALLOW_URI_AU
144c0 54 48 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20  THORITY.    if( 
144d0 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20  strncmp(zUri+5, 
144e0 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a  "///", 3)==0 ){.
144f0 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20        iIn = 7;. 
14500 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
14510 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20  owing condition 
14520 63 61 75 73 65 73 20 55 52 49 73 20 77 69 74 68  causes URIs with
14530 20 66 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20   five leading / 
14540 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20  characters.     
14550 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f   ** like file://
14560 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20  ///host/path to 
14570 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
14580 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f  o UNCs like //ho
14590 73 74 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a  st/path..      *
145a0 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20 55 52  * The correct UR
145b0 49 20 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68  I for that UNC h
145c0 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66  as only two or f
145d0 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68  our leading / ch
145e0 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a  aracters.      *
145f0 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61  * file://host/pa
14600 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68  th or file:////h
14610 6f 73 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35  ost/path.  But 5
14620 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73   leading slashes
14630 20 69 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   is a .      ** 
14640 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65  common error, we
14650 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65   are told, so we
14660 20 68 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20   handle it as a 
14670 73 70 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f  special case. */
14680 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
14690 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22  mp(zUri+7, "///"
146a0 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b  , 3)==0 ){ iIn++
146b0 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ; }.    }else if
146c0 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35  ( strncmp(zUri+5
146d0 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22  , "//localhost/"
146e0 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 12)==0 ){.    
146f0 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20    iIn = 16;.    
14700 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44  }.#else.    /* D
14710 69 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d  iscard the schem
14720 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20  e and authority 
14730 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  segments of the 
14740 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  URI. */.    if( 
14750 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20  zUri[5]=='/' && 
14760 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a  zUri[6]=='/' ){.
14770 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20        iIn = 7;. 
14780 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69       while( zUri
14790 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49  [iIn] && zUri[iI
147a0 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b  n]!='/' ) iIn++;
147b0 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d  .      if( iIn!=
147c0 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c  7 && (iIn!=16 ||
147d0 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f   memcmp("localho
147e0 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39  st", &zUri[7], 9
147f0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  )) ){.        *p
14800 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
14810 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c  3_mprintf("inval
14820 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79  id uri authority
14830 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20  : %.*s", .      
14840 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55        iIn-7, &zU
14850 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20  ri[7]);.        
14860 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
14870 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
14880 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
14890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
148a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79  dif..    /* Copy
148b0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
148c0 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61  d any query para
148d0 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  meters into the 
148e0 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20  zFile buffer. . 
148f0 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48     ** Decode %HH
14900 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c   escape codes al
14910 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20  ong the way. .  
14920 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68    **.    ** With
14930 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61  in this loop, va
14940 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61  riable eState ma
14950 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31  y be set to 0, 1
14960 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67   or 2, depending
14970 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70  .    ** on the p
14980 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
14990 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  As follows:.    
149a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50  **.    **   0: P
149b0 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65  arsing file-name
149c0 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61  ..    **   1: Pa
149d0 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69  rsing name secti
149e0 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
149f0 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
14a00 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20  er..    **   2: 
14a10 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65  Parsing value se
14a20 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
14a30 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
14a40 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  meter..    */.  
14a50 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20    eState = 0;.  
14a60 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
14a70 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
14a80 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  !='#' ){.      i
14a90 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
14aa0 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26  c=='%' .       &
14ab0 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69  & sqlite3Isxdigi
14ac0 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20  t(zUri[iIn]) .  
14ad0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
14ae0 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
14af0 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  +1]) .      ){. 
14b00 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74         int octet
14b10 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f   = (sqlite3HexTo
14b20 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29  Int(zUri[iIn++])
14b30 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20   << 4);.        
14b40 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  octet += sqlite3
14b50 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
14b60 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20  n++]);..        
14b70 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30  assert( octet>=0
14b80 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b   && octet<256 );
14b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74  .        if( oct
14ba0 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
14bb0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
14bc0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
14bd0 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69  "%00" appears wi
14be0 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e  thin the URI. In
14bf0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
14c00 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72  ** case we ignor
14c10 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68  e all text in th
14c20 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
14c30 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72  he path, name or
14c40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
14c50 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  lue currently be
14c60 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69  ing parsed. So i
14c70 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  gnore the curren
14c80 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20  t character.    
14c90 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69        ** and ski
14ca0 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f  p to the next "?
14cb0 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61  ", "=" or "&", a
14cc0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a  s appropriate. *
14cd0 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  /.          whil
14ce0 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e  e( (c = zUri[iIn
14cf0 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20  ])!=0 && c!='#' 
14d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
14d10 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20  & (eState!=0 || 
14d20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20  c!='?').        
14d30 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
14d40 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26  !=1 || (c!='=' &
14d50 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20  & c!='&')).     
14d60 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
14d70 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27  ate!=2 || c!='&'
14d80 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
14d90 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b             iIn++
14da0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14db0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
14dc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14dd0 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20      c = octet;. 
14de0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
14df0 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d  State==1 && (c==
14e00 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29  '&' || c=='=') )
14e10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  {.        if( zF
14e20 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29  ile[iOut-1]==0 )
14e30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
14e40 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e  n empty option n
14e50 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73  ame. Ignore this
14e60 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68   option altogeth
14e70 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  er. */.         
14e80 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
14e90 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
14ea0 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d  '#' && zUri[iIn-
14eb0 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b  1]!='&' ) iIn++;
14ec0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
14ed0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
14ee0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26         if( c=='&
14ef0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
14f00 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
14f10 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  \0';.        }el
14f20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53  se{.          eS
14f30 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20  tate = 2;.      
14f40 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
14f50 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
14f60 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26  f( (eState==0 &&
14f70 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74   c=='?') || (eSt
14f80 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27  ate==2 && c=='&'
14f90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ) ){.        c =
14fa0 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61   0;.        eSta
14fb0 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  te = 1;.      }.
14fc0 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
14fd0 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20  ++] = c;.    }. 
14fe0 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31     if( eState==1
14ff0 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d   ) zFile[iOut++]
15000 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
15010 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
15020 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  ';.    zFile[iOu
15030 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  t++] = '\0';..  
15040 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
15050 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74  ere were any opt
15060 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74  ions specified t
15070 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  hat should be in
15080 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a  terpreted .    *
15090 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20  * here. Options 
150a0 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72  that are interpr
150b0 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64  eted here includ
150c0 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73  e "vfs" and thos
150d0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f  e that.    ** co
150e0 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67  rrespond to flag
150f0 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61  s that may be pa
15100 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  ssed to the sqli
15110 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20  te3_open_v2().  
15120 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a    ** method. */.
15130 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c      zOpt = &zFil
15140 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
15150 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20  0(zFile)+1];.   
15160 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20   while( zOpt[0] 
15170 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70  ){.      int nOp
15180 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  t = sqlite3Strle
15190 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20  n30(zOpt);.     
151a0 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a   char *zVal = &z
151b0 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20  Opt[nOpt+1];.   
151c0 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71     int nVal = sq
151d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56  lite3Strlen30(zV
151e0 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  al);..      if( 
151f0 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d  nOpt==3 && memcm
15200 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33  p("vfs", zOpt, 3
15210 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15220 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20  zVfs = zVal;.   
15230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15240 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64    struct OpenMod
15250 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  e {.          co
15260 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
15270 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b         int mode;
15280 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64  .        } *aMod
15290 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
152a0 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d  har *zModeType =
152b0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
152c0 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  mask = 0;.      
152d0 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b    int limit = 0;
152e0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  ..        if( nO
152f0 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28  pt==5 && memcmp(
15300 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35  "cache", zOpt, 5
15310 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15320 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
15330 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d  OpenMode aCacheM
15340 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
15350 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22        { "shared"
15360 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ,  SQLITE_OPEN_S
15370 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20  HAREDCACHE },.  
15380 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69            { "pri
15390 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50  vate", SQLITE_OP
153a0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
153b0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
153c0 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
153d0 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
153e0 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
153f0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53  EN_SHAREDCACHE|S
15400 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
15410 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20  TECACHE;.       
15420 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68     aMode = aCach
15430 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  eMode;.         
15440 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20   limit = mask;. 
15450 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
15460 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20  pe = "cache";.  
15470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15480 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d  if( nOpt==4 && m
15490 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f  emcmp("mode", zO
154a0 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 4)==0 ){.   
154b0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
154c0 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f  ruct OpenMode aO
154d0 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  penMode[] = {.  
154e0 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22            { "ro"
154f0 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
15500 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20  EADONLY },.     
15510 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20         { "rw",  
15520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15530 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20  WRITE }, .      
15540 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53        { "rwc", S
15550 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
15560 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
15570 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20  EN_CREATE },.   
15580 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f           { "memo
15590 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ry", SQLITE_OPEN
155a0 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20  _MEMORY },.     
155b0 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
155c0 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
155d0 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
155e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
155f0 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  NLY | SQLITE_OPE
15600 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20  N_READWRITE.    
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
15620 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
15630 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
15640 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20  N_MEMORY;.      
15650 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65      aMode = aOpe
15660 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  nMode;.         
15670 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20   limit = mask & 
15680 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
15690 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63   zModeType = "ac
156a0 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d  cess";.        }
156b0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d  ..        if( aM
156c0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
156d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
156e0 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a    int mode = 0;.
156f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
15700 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69  0; aMode[i].z; i
15710 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
15720 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
15730 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20   aMode[i].z;.   
15740 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61           if( nVa
15750 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  l==sqlite3Strlen
15760 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63  30(z) && 0==memc
15770 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c  mp(zVal, z, nVal
15780 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
15790 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b     mode = aMode[
157a0 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  i].mode;.       
157b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
157c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
157d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
157e0 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b    if( mode==0 ){
157f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a  .            *pz
15800 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
15810 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63  _mprintf("no suc
15820 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20  h %s mode: %s", 
15830 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29  zModeType, zVal)
15840 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
15850 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15860 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
15870 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
15880 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15890 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65         if( (mode
158a0 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & ~SQLITE_OPEN_
158b0 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b  MEMORY)>limit ){
158c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a  .            *pz
158d0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
158e0 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64  _mprintf("%s mod
158f0 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25  e not allowed: %
15900 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64              zMod
15930 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
15940 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
15950 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
15960 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
15970 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
15980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15990 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73    flags = (flags
159a0 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65   & ~mask) | mode
159b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
159c0 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20    }..      zOpt 
159d0 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b  = &zVal[nVal+1];
159e0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
159f0 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  .    zFile = sql
15a00 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55  ite3_malloc64(nU
15a10 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21  ri+2);.    if( !
15a20 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
15a30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15a40 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a   memcpy(zFile, z
15a50 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
15a60 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c  zFile[nUri] = '\
15a70 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55  0';.    zFile[nU
15a80 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ri+1] = '\0';.  
15a90 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
15aa0 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d  TE_OPEN_URI;.  }
15ab0 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c  ..  *ppVfs = sql
15ac0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56  ite3_vfs_find(zV
15ad0 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66  fs);.  if( *ppVf
15ae0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45  s==0 ){.    *pzE
15af0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
15b00 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
15b10 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29   vfs: %s", zVfs)
15b20 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
15b30 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61  E_ERROR;.  }. pa
15b40 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69  rse_uri_out:.  i
15b50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15b60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15b70 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  free(zFile);.   
15b80 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a   zFile = 0;.  }.
15b90 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67    *pFlags = flag
15ba0 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a  s;.  *pzFile = z
15bb0 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  File;.  return r
15bc0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
15bd0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
15be0 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69  he work of openi
15bf0 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e  ng a database on
15c00 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71   behalf of.** sq
15c10 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64  lite3_open() and
15c20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
15c30 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ). The database 
15c40 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e  filename "zFilen
15c50 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46  ame"  .** is UTF
15c60 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73  -8 encoded..*/.s
15c70 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61  tatic int openDa
15c80 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20  tabase(.  const 
15c90 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
15ca0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
15cb0 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f  ename UTF-8 enco
15cc0 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
15cd0 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
15ce0 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64  /* OUT: Returned
15cf0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15d00 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
15d10 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20  nt flags,    /* 
15d20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67  Operational flag
15d30 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
15d40 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a  r *zVfs       /*
15d50 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   Name of the VFS
15d60 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
15d70 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74  /* Store allocat
15da0 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  ed handle here *
15db0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
15de0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68  de */.  int isTh
15df0 72 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20  readsafe;       
15e00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15e10 66 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63  for threadsafe c
15e20 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
15e30 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b  char *zOpen = 0;
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  /* Filename argu
15e60 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
15e70 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20  BtreeOpen() */. 
15e80 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
15e90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15ea0 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
15eb0 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61  e from sqlite3Pa
15ec0 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66  rseUri() */..#if
15ed0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15ee0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
15ef0 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75  ( ppDb==0 ) retu
15f00 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
15f10 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
15f20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
15f30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15f40 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
15f50 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
15f60 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
15f70 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
15f80 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  f..  /* Only all
15f90 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62  ow sensible comb
15fa0 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73  inations of bits
15fb0 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72   in the flags ar
15fc0 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54  gument.  .  ** T
15fd0 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
15fe0 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63   any non-sense c
15ff0 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73  ombination is us
16000 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ed.  If we.  ** 
16010 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c  do not block ill
16020 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  egal combination
16030 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64  s here, it could
16040 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73   trigger.  ** as
16050 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
16060 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65  s in deeper laye
16070 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f  rs.  Sensible co
16080 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  mbinations.  ** 
16090 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  are:.  **.  **  
160a0 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  1:  SQLITE_OPEN_
160b0 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32  READONLY.  **  2
160c0 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
160d0 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36  EADWRITE.  **  6
160e0 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
160f0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
16100 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20  E_OPEN_CREATE.  
16110 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
16120 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16130 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20  Y  == 0x01 );.  
16140 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
16150 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d  PEN_READWRITE ==
16160 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72   0x02 );.  asser
16170 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  t( SQLITE_OPEN_C
16180 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34  REATE    == 0x04
16190 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
161a0 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
161b0 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f  0x02 ); /* READO
161c0 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  NLY */.  testcas
161d0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
161e0 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45  )==0x04 ); /* RE
161f0 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73  ADWRITE */.  tes
16200 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
16210 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f  s&7))==0x40 ); /
16220 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52  * READWRITE | CR
16230 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28  EATE */.  if( ((
16240 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20  1<<(flags&7)) & 
16250 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0x46)==0 ){.    
16260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
16270 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49  SUSE_BKPT;  /* I
16280 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34 34 35 39  MP: R-65497-4459
16290 34 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66 28 20  4 */.  }..  if( 
162a0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
162b0 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
162c0 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
162d0 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
162e0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
162f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
16300 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
16310 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
16320 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
16330 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
16340 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
16350 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
16360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
16370 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
16380 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
16390 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20  FullMutex;.  }. 
163a0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
163b0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
163c0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
163d0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
163e0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
163f0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
16400 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16410 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
16420 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
16430 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
16440 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
16450 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
16460 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
16470 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
16480 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
16490 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
164a0 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
164b0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
164c0 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
164d0 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
164e0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
164f0 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
16500 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
16510 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
16520 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
16530 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
16540 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16550 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
16560 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16570 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
16580 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
16590 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
165a0 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
165b0 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
165c0 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
165d0 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
165e0 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
165f0 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
16600 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
16610 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
16620 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16640 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
16650 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
16660 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16670 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
16680 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16690 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
166a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
166c0 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
166d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
166e0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
166f0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
16700 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
16710 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
16720 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16730 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
16740 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
16750 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16760 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
16770 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
16780 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
16790 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
167a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
167b0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
167c0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
167d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
167e0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
167f0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
16800 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
16810 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
16820 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
16830 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
16840 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
16850 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
16860 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
16870 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a  isThreadsafe ){.
16880 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
16890 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
168a0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
168b0 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
168c0 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
168d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
168e0 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
168f0 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
16900 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
16910 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
16920 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16930 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
16940 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
16950 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
16960 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
16970 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
16980 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
16990 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20  ->aDbStatic;..  
169a0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
169b0 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
169c0 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
169d0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
169e0 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
169f0 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
16a00 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c  imit));.  db->aL
16a10 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
16a20 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
16a30 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ] = SQLITE_DEFAU
16a40 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  LT_WORKER_THREAD
16a50 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  S;.  db->autoCom
16a60 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e  mit = 1;.  db->n
16a70 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b  extAutovac = -1;
16a80 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20  .  db->szMmap = 
16a90 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16aa0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62  fig.szMmap;.  db
16ab0 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
16ac0 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f   0;.  db->nMaxSo
16ad0 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46  rterMmap = 0x7FF
16ae0 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61  FFFFF;.  db->fla
16af0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
16b00 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c  rtColNames | SQL
16b10 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65  ITE_EnableTrigge
16b20 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65  r | SQLITE_Cache
16b30 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e  Spill.#if !defin
16b40 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
16b50 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
16b60 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46  X) || SQLITE_DEF
16b70 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
16b80 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20 20 20  NDEX.           
16b90 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
16ba0 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a  utoIndex.#endif.
16bb0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
16bc0 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43  LT_CKPTFULLFSYNC
16bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16be0 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46    | SQLITE_CkptF
16bf0 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a  ullFSync.#endif.
16c00 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
16c10 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34  LT_FILE_FORMAT<4
16c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16c30 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63    | SQLITE_Legac
16c40 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a  yFileFmt.#endif.
16c50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16c60 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
16c70 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
16c80 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f       | SQLITE_Lo
16c90 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64  adExtension.#end
16ca0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
16cb0 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f  FAULT_RECURSIVE_
16cc0 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20  TRIGGERS.       
16cd0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
16ce0 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23  TE_RecTriggers.#
16cf0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
16d00 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  d(SQLITE_DEFAULT
16d10 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26  _FOREIGN_KEYS) &
16d20 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  & SQLITE_DEFAULT
16d30 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20  _FOREIGN_KEYS.  
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16d50 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b   SQLITE_ForeignK
16d60 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  eys.#endif.#if d
16d70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45  efined(SQLITE_RE
16d80 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f  VERSE_UNORDERED_
16d90 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20  SELECTS).       
16da0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
16db0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a  TE_ReverseOrder.
16dc0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
16dd0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
16de0 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
16df0 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20  HECK).          
16e00 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
16e10 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69  CellSizeCk.#endi
16e20 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
16e30 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
16e40 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
16e50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16e60 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
16e70 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
16e80 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
16e90 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
16ea0 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
16eb0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
16ec0 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
16ed0 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
16ee0 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
16ef0 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
16f00 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
16f10 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
16f20 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
16f30 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
16f40 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
16f50 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
16f60 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
16f70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44  ..  **.  ** EVID
16f80 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36  ENCE-OF: R-52786
16f90 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20 64 65  -44878 SQLite de
16fa0 66 69 6e 65 73 20 74 68 72 65 65 20 62 75 69 6c  fines three buil
16fb0 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20  t-in collating. 
16fc0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20   ** functions:. 
16fd0 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
16fe0 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
16ff0 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  Y", SQLITE_UTF8,
17000 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
17010 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
17020 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
17030 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  RY", SQLITE_UTF1
17040 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6BE, 0, binCollF
17050 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
17060 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
17070 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
17080 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43  UTF16LE, 0, binC
17090 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
170a0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
170b0 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c  b, "NOCASE", SQL
170c0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63  ITE_UTF8, 0, noc
170d0 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
170e0 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
170f0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52  llation(db, "RTR
17100 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  IM", SQLITE_UTF8
17110 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43  , (void*)1, binC
17120 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69  ollFunc, 0);.  i
17130 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
17140 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
17150 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
17160 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17170 3a 20 52 2d 30 38 33 30 38 2d 31 37 32 32 34 20  : R-08308-17224 
17180 54 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  The default coll
17190 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66  ating function f
171a0 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69  or all.  ** stri
171b0 6e 67 73 20 69 73 20 42 49 4e 41 52 59 2e 20 0a  ngs is BINARY. .
171c0 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74    */.  db->pDflt
171d0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
171e0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  ndCollSeq(db, SQ
171f0 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41  LITE_UTF8, "BINA
17200 52 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  RY", 0);.  asser
17210 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  t( db->pDfltColl
17220 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  !=0 );..  /* Par
17230 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f  se the filename/
17240 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f  URI argument. */
17250 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  .  db->openFlags
17260 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d   = flags;.  rc =
17270 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
17280 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
17290 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
172a0 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
172b0 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
172c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
172d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
172e0 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61  E_NOMEM ) db->ma
172f0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
17300 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17310 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20  WithMsg(db, rc, 
17320 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
17330 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20   0, zErrMsg);.  
17340 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17350 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74  ErrMsg);.    got
17360 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
17370 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
17380 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73   backend databas
17390 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63  e driver */.  rc
173a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
173b0 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f  pen(db->pVfs, zO
173c0 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44  pen, db, &db->aD
173d0 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20  b[0].pBt, 0,.   
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c       flags | SQL
17400 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
17410 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
17430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
17440 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  RR_NOMEM ){.    
17450 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17460 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  MEM;.    }.    s
17470 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
17480 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  rc);.    goto op
17490 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
174a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
174b0 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  r(db->aDb[0].pBt
174c0 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  );.  db->aDb[0].
174d0 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
174e0 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64  3SchemaGet(db, d
174f0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
17500 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
17510 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64 62  cFailed ) ENC(db
17520 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64  ) = SCHEMA_ENC(d
17530 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
17540 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62 5b  eeLeave(db->aDb[
17550 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
17560 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[1].pSchema = 
17570 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
17580 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54  (db, 0);..  /* T
17590 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74  he default safet
175a0 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  y_level for the 
175b0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
175c0 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65   'full'; for the
175d0 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
175e0 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27  ase it is 'NONE'
175f0 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
17600 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
17610 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
17620 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
17630 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
17640 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
17650 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62  _level = 3;.  db
17660 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[1].zName =
17670 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61   "temp";.  db->a
17680 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[1].safety_lev
17690 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d  el = 1;..  db->m
176a0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
176b0 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20  GIC_OPEN;.  if( 
176c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
176d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
176e0 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
176f0 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
17700 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
17710 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61  ns, but do not a
17720 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
17730 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
17740 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69   schema yet. Thi
17750 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
17760 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  il the first tim
17770 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
17780 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e   ** is accessed.
17790 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
177a0 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
177b0 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  OK);.  sqlite3Re
177c0 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
177d0 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f  ctions(db);..  /
177e0 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63  * Load automatic
177f0 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78   extensions - ex
17800 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61  tensions that ha
17810 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  ve been register
17820 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  ed.  ** using th
17830 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61  e sqlite3_automa
17840 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20  tic_extension() 
17850 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  API..  */.  rc =
17860 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
17870 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  (db);.  if( rc==
17880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17890 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
178a0 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
178b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
178c0 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
178d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
178e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
178f0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
17900 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
17910 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
17920 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S1.  if( !db->ma
17930 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
17940 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
17950 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c  ite3Fts1Init(sql
17960 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
17970 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
17980 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
17990 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
179a0 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66  ENABLE_FTS2.  if
179b0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
179c0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
179d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65  E_OK ){.    exte
179e0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
179f0 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s2Init(sqlite3*)
17a00 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
17a10 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a  e3Fts2Init(db);.
17a20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
17a30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17a40 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d  _FTS3.  if( !db-
17a50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
17a60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17a70 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17a80 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a  e3Fts3Init(db);.
17a90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
17aa0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17ab0 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e  _ICU.  if( !db->
17ac0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
17ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17ae0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17af0 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20  3IcuInit(db);.  
17b00 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
17b10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52   SQLITE_ENABLE_R
17b20 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e  TREE.  if( !db->
17b30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
17b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
17b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17b60 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20  RtreeInit(db);. 
17b70 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
17b80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17b90 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20 69 66  DBSTAT_VTAB.  if
17ba0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
17bb0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
17bc0 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
17bd0 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65 67  sqlite3DbstatReg
17be0 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23  ister(db);.  }.#
17bf0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51  endif..  /* -DSQ
17c00 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
17c10 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65  KING_MODE=1 make
17c20 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20  s EXCLUSIVE the 
17c30 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
17c40 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51    ** mode.  -DSQ
17c50 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
17c60 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65  KING_MODE=0 make
17c70 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
17c80 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
17c90 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f   mode.  Doing no
17ca0 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73  thing at all als
17cb0 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74  o makes NORMAL t
17cc0 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  he default..  */
17cd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
17ce0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
17cf0 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f  ODE.  db->dfltLo
17d00 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ckMode = SQLITE_
17d10 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
17d20 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50  MODE;.  sqlite3P
17d30 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
17d40 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
17d50 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  r(db->aDb[0].pBt
17d60 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
17d70 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17d80 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
17d90 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69  ING_MODE);.#endi
17da0 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73 71  f..  if( rc ) sq
17db0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
17dc0 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65  c);..  /* Enable
17dd0 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d   the lookaside-m
17de0 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
17df0 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73  */.  setupLookas
17e00 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74  ide(db, 0, sqlit
17e10 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
17e20 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20  zLookaside,.    
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
17e50 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  lConfig.nLookasi
17e60 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  de);..  sqlite3_
17e70 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
17e80 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45  nt(db, SQLITE_DE
17e90 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48  FAULT_WAL_AUTOCH
17ea0 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e  ECKPOINT);..open
17eb0 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  db_out:.  sqlite
17ec0 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20  3_free(zOpen);. 
17ed0 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61   if( db ){.    a
17ee0 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78  ssert( db->mutex
17ef0 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73  !=0 || isThreads
17f00 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  afe==0.         
17f10 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62    || sqlite3Glob
17f20 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
17f30 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
17f40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
17f50 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
17f60 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
17f70 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
17f80 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c  assert( db!=0 ||
17f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
17fa0 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  M );.  if( rc==S
17fb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
17fc0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
17fd0 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
17fe0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
17ff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18000 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
18010 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
18020 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20  ;.  }.  *ppDb = 
18030 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  db;.#ifdef SQLIT
18040 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
18050 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
18060 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
18070 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  g ){.    /* Open
18080 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e  ing a db handle.
18090 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
180a0 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a  r is passed 0. *
180b0 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67  /.    void *pArg
180c0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
180d0 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
180e0 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  g;.    sqlite3Gl
180f0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
18100 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69  og(pArg, db, zFi
18110 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  lename, 0);.  }.
18120 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
18130 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  rc & 0xff;.}../*
18140 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
18150 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
18160 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
18170 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
18180 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  r *zFilename, . 
18190 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20   sqlite3 **ppDb 
181a0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
181b0 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
181c0 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  ame, ppDb,.     
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
181f0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
18200 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
18210 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
18220 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20  pen_v2(.  const 
18230 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
18240 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
18250 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a  lename (UTF-8) *
18260 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
18270 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Db,         /* O
18280 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61  UT: SQLite db ha
18290 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ndle */.  int fl
182a0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
182b0 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20    /* Flags */.  
182c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
182d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
182e0 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f  of VFS module to
182f0 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   use */.){.  ret
18300 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
18310 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  (filename, ppDb,
18320 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66   (unsigned int)f
18330 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
18340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18350 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
18360 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
18370 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
18380 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
18390 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
183a0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
183b0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
183c0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
183d0 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
183e0 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
183f0 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
18400 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
18410 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
18420 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
18430 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18440 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
18450 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29  .  if( ppDb==0 )
18460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
18470 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
18480 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  if.  *ppDb = 0;.
18490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
184a0 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
184b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
184c0 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
184d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
184e0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69  #endif.  if( zFi
184f0 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c  lename==0 ) zFil
18500 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30  ename = "\000\00
18510 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  0";.  pVal = sql
18520 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
18530 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
18540 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
18550 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
18560 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
18570 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
18580 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
18590 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
185a0 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
185b0 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
185c0 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
185d0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
185e0 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18610 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
18620 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
18630 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
18640 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
18650 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
18660 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18670 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
18680 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
18690 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
186a0 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41   ){.      SCHEMA
186b0 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e  _ENC(*ppDb) = EN
186c0 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54  C(*ppDb) = SQLIT
186d0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
186e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
186f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18700 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  MEM;.  }.  sqlit
18710 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
18720 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 20  );..  return rc 
18730 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66  & 0xff;.}.#endif
18740 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18750 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
18760 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
18770 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
18780 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
18790 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
187a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
187b0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
187c0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
187d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
187e0 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
187f0 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
18800 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
18810 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
18820 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
18830 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74   void*).){.  ret
18840 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61  urn sqlite3_crea
18850 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
18860 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20  db, zName, enc, 
18870 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
18880 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  0);.}../*.** Reg
18890 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
188a0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
188b0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
188c0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
188d0 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
188e0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a  e_collation_v2(.
188f0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
18900 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
18910 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
18920 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
18930 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
18940 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
18950 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
18960 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
18970 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
18980 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64  .  int rc;..#ifd
18990 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
189a0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
189b0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
189c0 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e  heckOk(db) || zN
189d0 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
189e0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
189f0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
18a00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
18a10 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
18a20 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
18a30 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
18a40 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
18a50 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
18a60 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
18a70 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20  mpare, xDel);.  
18a80 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
18a90 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
18aa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
18ab0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
18ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
18ad0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18ae0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
18af0 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
18b00 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b10 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
18b20 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
18b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
18b40 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28  ate_collation16(
18b50 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
18b60 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
18b70 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  Name,.  int enc,
18b80 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
18b90 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
18ba0 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
18bb0 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
18bc0 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
18bd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18be0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b  .  char *zName8;
18bf0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18c00 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
18c10 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
18c20 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
18c30 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72   || zName==0 ) r
18c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
18c50 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
18c60 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18c70 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
18c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
18c90 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18ca0 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
18cb0 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
18cc0 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
18cd0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
18ce0 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b  .  if( zName8 ){
18cf0 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65  .    rc = create
18d00 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
18d10 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70  ame8, (u8)enc, p
18d20 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
18d30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
18d40 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29  Free(db, zName8)
18d50 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
18d60 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
18d70 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
18d80 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
18d90 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
18da0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
18db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
18dc0 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
18dd0 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
18de0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
18df0 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
18e00 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
18e10 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
18e20 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
18e30 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
18e40 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
18e50 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
18e60 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
18e70 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74  _needed(.  sqlit
18e80 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
18e90 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
18ea0 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
18eb0 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c  eeded)(void*,sql
18ec0 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
18ed0 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  ep,const char*).
18ee0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
18ef0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
18f00 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
18f10 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
18f20 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
18f30 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
18f40 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
18f50 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
18f60 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
18f70 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c  ollNeeded = xCol
18f80 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78  lNeeded;.  db->x
18f90 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30  CollNeeded16 = 0
18fa0 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
18fb0 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
18fc0 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
18fd0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
18fe0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
18ff0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19000 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19010 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
19020 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
19030 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19040 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
19050 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
19060 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
19070 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
19080 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
19090 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
190a0 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
190b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
190c0 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
190d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
190e0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
190f0 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
19100 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29  (*xCollNeeded16)
19110 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
19120 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
19130 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66  st void*).){.#if
19140 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19150 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
19160 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
19170 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
19180 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
19190 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
191a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
191b0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
191c0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
191d0 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78  ded = 0;.  db->x
191e0 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78  CollNeeded16 = x
191f0 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20  CollNeeded16;.  
19200 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
19210 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
19220 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
19230 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
19240 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
19250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
19260 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19270 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
19280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19290 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
192a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
192b0 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72  is now an anachr
192c0 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74  onism. It used t
192d0 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63  o be used to rec
192e0 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d  over from a.** m
192f0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
19300 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20   but SQLite now 
19310 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61  does this automa
19320 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  tically..*/.int 
19330 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
19340 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20  ecover(void){.  
19350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19360 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
19370 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68  * Test to see wh
19380 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
19390 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
193a0 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63  tion is in autoc
193b0 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20  ommit.** mode.  
193c0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
193d0 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69  t is and FALSE i
193e0 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  f not.  Autocomm
193f0 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a  it mode is on.**
19400 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75   by default.  Au
19410 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61  tocommit is disa
19420 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20  bled by a BEGIN 
19430 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
19440 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68  enabled.** by th
19450 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72  e next COMMIT or
19460 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e   ROLLBACK..*/.in
19470 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  t sqlite3_get_au
19480 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  tocommit(sqlite3
19490 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
194a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
194b0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
194c0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
194d0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
194e0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
194f0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
19500 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
19510 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
19520 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
19530 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19540 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
19550 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e  stitutes for con
19560 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f  stants SQLITE_CO
19570 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45  RRUPT,.** SQLITE
19580 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f  _MISUSE, SQLITE_
19590 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45  CANTOPEN, SQLITE
195a0 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69  _IOERR and possi
195b0 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  bly other error.
195c0 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
195d0 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70 75  hey serve two pu
195e0 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
195f0 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
19600 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
19610 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
19620 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
19630 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
19640 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
19650 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
19660 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
19670 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
19680 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
19690 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
196a0 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
196b0 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
196c0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
196d0 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
196e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
196f0 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
19700 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
19710 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
19720 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
19730 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
19740 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
19750 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
19760 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
19770 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
19780 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
197a0 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
197b0 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
197c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
197d0 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
197e0 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
197f0 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
19800 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
19810 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
19820 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
19830 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
19840 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
19850 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
19860 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
19870 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
19880 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
19890 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
198a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
198b0 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
198c0 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
198d0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
198e0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
198f0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19900 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
19910 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
19920 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
19930 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
19940 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
19950 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
19960 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
19970 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
19980 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
19990 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
199a0 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
199b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
199c0 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
199d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
199e0 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
199f0 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
19a00 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
19a10 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
19a20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
19a30 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
19a40 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
19a50 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
19a60 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
19a70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
19a80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
19a90 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
19aa0 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
19ab0 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
19ac0 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
19ad0 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
19ae0 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
19af0 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
19b00 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
19b10 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
19b20 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
19b30 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
19b40 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
19b50 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
19b60 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
19b70 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
19b80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61  /.int sqlite3_ta
19b90 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
19ba0 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ata(.  sqlite3 *
19bb0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
19bc0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
19bd0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
19be0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
19bf0 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ,        /* Data
19c00 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c  base name or NUL
19c10 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
19c20 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20  r *zTableName,  
19c30 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
19c40 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19c50 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20   *zColumnName,  
19c60 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
19c70 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
19c80 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20   **pzDataType,  
19c90 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63    /* OUTPUT: Dec
19ca0 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20  lared data type 
19cb0 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
19cc0 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20  **pzCollSeq,    
19cd0 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c   /* OUTPUT: Coll
19ce0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
19cf0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  ame */.  int *pN
19d00 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  otNull,         
19d10 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
19d20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c  True if NOT NULL
19d30 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73   constraint exis
19d40 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72  ts */.  int *pPr
19d50 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20  imaryKey,       
19d60 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
19d70 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61  rue if column pa
19d80 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e  rt of PK */.  in
19d90 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20  t *pAutoinc     
19da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
19db0 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
19dc0 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72  umn is auto-incr
19dd0 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ement */.){.  in
19de0 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
19df0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62  rrMsg = 0;.  Tab
19e00 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
19e10 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
19e20 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30  ;.  int iCol = 0
19e30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
19e40 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20  zDataType = 0;. 
19e50 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
19e60 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74  llSeq = 0;.  int
19e70 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20   notnull = 0;.  
19e80 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d  int primarykey =
19e90 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e   0;.  int autoin
19ea0 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20  c = 0;...#ifdef 
19eb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
19ec0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
19ed0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
19ee0 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c  kOk(db) || zTabl
19ef0 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eName==0 ){.    
19f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
19f10 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
19f20 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75  endif..  /* Ensu
19f30 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
19f40 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
19f50 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
19f60 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
19f70 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
19f80 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
19f90 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
19fa0 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
19fb0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
19fc0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
19fd0 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
19fe0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
19ff0 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
1a000 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
1a010 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1a020 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
1a030 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
1a040 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
1a050 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
1a060 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
1a070 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
1a080 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
1a090 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
1a0a0 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
1a0b0 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
1a0c0 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d  if( zColumnName=
1a0d0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65  =0 ){.    /* Que
1a0e0 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65  ry for existance
1a0f0 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a   of table only *
1a100 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
1a110 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
1a120 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
1a130 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  ++){.      pCol 
1a140 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
1a150 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ol];.      if( 0
1a160 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1a170 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
1a180 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
1a190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a1a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1a1b0 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e  f( iCol==pTab->n
1a1c0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
1a1d0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1a1e0 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
1a1f0 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  d(zColumnName) )
1a200 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
1a210 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
1a220 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f        pCol = iCo
1a230 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43  l>=0 ? &pTab->aC
1a240 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20  ol[iCol] : 0;.  
1a250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a260 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
1a270 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
1a280 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1a290 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
1a2a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
1a2b0 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61   stores the meta
1a2c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
1a2d0 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
1a2e0 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63  ed.  ** to the c
1a2f0 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76  aller in local v
1a300 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79  ariables zDataTy
1a310 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f  pe, zCollSeq, no
1a320 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65  tnull, primaryke
1a330 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69  y.  ** and autoi
1a340 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  nc. At this poin
1a350 74 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  t there are two 
1a360 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20  possibilities:. 
1a370 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e   ** .  **     1.
1a380 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63   The specified c
1a390 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72  olumn name was r
1a3a0 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20  owid", "oid" or 
1a3b0 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20  "_rowid_" .  ** 
1a3c0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65         and there
1a3d0 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c   is no explicitl
1a3e0 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63  y declared IPK c
1a3f0 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a  olumn. .  **.  *
1a400 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62  *     2. The tab
1a410 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  le is not a view
1a420 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
1a430 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20  name identified 
1a440 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  an .  **        
1a450 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
1a460 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79  red column. Copy
1a470 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
1a480 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20  n from *pCol..  
1a490 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29  */ .  if( pCol )
1a4a0 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
1a4b0 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
1a4c0 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43     zCollSeq = pC
1a4d0 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e  ol->zColl;.    n
1a4e0 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e  otnull = pCol->n
1a4f0 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70  otNull!=0;.    p
1a500 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43  rimarykey  = (pC
1a510 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43  ol->colFlags & C
1a520 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
1a530 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20  =0;.    autoinc 
1a540 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69  = pTab->iPKey==i
1a550 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61  Col && (pTab->ta
1a560 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
1a570 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20  increment)!=0;. 
1a580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74   }else{.    zDat
1a590 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  aType = "INTEGER
1a5a0 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  ";.    primaryke
1a5b0 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 1;.  }.  if(
1a5c0 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20   !zCollSeq ){.  
1a5d0 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49    zCollSeq = "BI
1a5e0 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f  NARY";.  }..erro
1a5f0 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1a600 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
1a610 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72  );..  /* Whether
1a620 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
1a630 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20  ll succeeded or 
1a640 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20  failed, set the 
1a650 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1a660 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76  s.  ** to whatev
1a670 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63  er their local c
1a680 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74  ounterparts cont
1a690 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ain. If an error
1a6a0 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a   did occur,.  **
1a6b0 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66   this has the ef
1a6c0 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20  fect of zeroing 
1a6d0 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  all output param
1a6e0 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eters..  */.  if
1a6f0 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a  ( pzDataType ) *
1a700 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61  pzDataType = zDa
1a710 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a  taType;.  if( pz
1a720 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c  CollSeq ) *pzCol
1a730 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b  lSeq = zCollSeq;
1a740 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20  .  if( pNotNull 
1a750 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f  ) *pNotNull = no
1a760 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72  tnull;.  if( pPr
1a770 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69  imaryKey ) *pPri
1a780 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72  maryKey = primar
1a790 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74  ykey;.  if( pAut
1a7a0 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63  oinc ) *pAutoinc
1a7b0 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69   = autoinc;..  i
1a7c0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
1a7d0 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
1a7e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a7f0 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b, zErrMsg);.   
1a800 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
1a810 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1a820 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c  o such table col
1a830 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61  umn: %s.%s", zTa
1a840 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
1a850 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20   zColumnName);. 
1a860 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1a870 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
1a880 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
1a890 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
1a8a0 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
1a8b0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1a8c0 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1a8d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a8e0 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
1a8f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a900 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1a910 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a920 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  }../*.** Sleep f
1a930 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
1a940 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
1a950 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
1a960 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ept..*/.int sqli
1a970 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73  te3_sleep(int ms
1a980 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1a990 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63   *pVfs;.  int rc
1a9a0 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74  ;.  pVfs = sqlit
1a9b0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
1a9c0 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20    if( pVfs==0 ) 
1a9d0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
1a9e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
1a9f0 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
1aa00 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
1aa10 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
1aa20 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
1aa30 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
1aa40 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
1aa50 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
1aa60 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
1aa70 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
1aa80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1aa90 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
1aaa0 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
1aab0 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
1aac0 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
1aad0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
1aae0 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
1aaf0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
1ab00 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f){.#ifdef SQLIT
1ab10 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1ab20 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1ab30 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1ab40 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1ab50 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1ab60 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1ab70 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1ab80 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
1ab90 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
1aba0 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
1abb0 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
1abc0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1abd0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1abe0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1abf0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
1ac00 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
1ac10 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
1ac20 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
1ac30 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
1ac40 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
1ac50 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1ac60 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
1ac70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1ac80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ac90 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20  _ERROR;.  Btree 
1aca0 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66  *pBtree;..#ifdef
1acb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1acc0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1acd0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1ace0 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1acf0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1ad00 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1ad10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1ad20 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1ad30 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65   pBtree = sqlite
1ad40 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1ad50 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  b, zDbName);.  i
1ad60 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1ad70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
1ad80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1ad90 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65   *fd;.    sqlite
1ada0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1adb0 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ee);.    pPager 
1adc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
1add0 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
1ade0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1adf0 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73  =0 );.    fd = s
1ae00 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
1ae10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
1ae20 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20  ert( fd!=0 );.  
1ae30 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
1ae40 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
1ae50 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1ae60 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1ae70 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72  rg = fd;.      r
1ae80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ae90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d     }else if( fd-
1aea0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1aeb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1aec0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c  sFileControl(fd,
1aed0 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20   op, pArg);.    
1aee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1aef0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
1af00 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  D;.    }.    sql
1af10 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1af20 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Btree);.  }.  sq
1af30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1af40 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1af50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1af60 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
1af70 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67   the testing log
1af80 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ic..*/.int sqlit
1af90 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1afa0 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
1afb0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64  int rc = 0;.#ifd
1afc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
1afd0 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 55 4e  UILTIN_TEST.  UN
1afe0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f  USED_PARAMETER(o
1aff0 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c  p);.#else.  va_l
1b000 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1b010 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
1b020 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
1b030 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
1b040 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1b050 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
1b060 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1b070 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1b080 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
1b090 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
1b0a0 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
1b0b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1b0c0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
1b0d0 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
1b0e0 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
1b0f0 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
1b100 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
1b110 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
1b120 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
1b130 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
1b140 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
1b150 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
1b160 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
1b170 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1b180 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1b190 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
1b1a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1b1b0 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
1b1c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b1d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1b1e0 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
1b1f0 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
1b200 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
1b210 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
1b220 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
1b230 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1b240 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
1b250 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
1b260 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
1b270 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
1b280 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
1b290 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
1b2a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1b2b0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1b2c0 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
1b2d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
1b2e0 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
1b2f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b300 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1b310 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1b320 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
1b330 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
1b340 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1b350 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
1b360 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
1b370 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
1b380 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
1b390 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
1b3a0 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
1b3b0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
1b3c0 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
1b3d0 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
1b3e0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1b3f0 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
1b400 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
1b410 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
1b420 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
1b430 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
1b440 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
1b450 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1b460 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1b470 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1b480 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
1b490 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
1b4a0 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
1b4b0 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
1b4c0 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
1b4d0 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
1b4e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
1b4f0 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
1b500 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
1b510 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1b520 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1b530 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1b540 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c  l(FAULT_INSTALL,
1b550 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20   xCallback).    
1b560 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67  **.    ** Arrang
1b570 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c  e to invoke xCal
1b580 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72  lback() whenever
1b590 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1b5a0 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20  () is called,.  
1b5b0 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63    ** if xCallbac
1b5c0 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  k is not NULL.. 
1b5d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20     **.    ** As 
1b5e0 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61  a test of the fa
1b5f0 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65  ult simulator me
1b600 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20  chanism itself, 
1b610 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1b620 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c  0).    ** is cal
1b630 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  led immediately 
1b640 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67  after installing
1b650 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63   the new callbac
1b660 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  k and the return
1b670 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72  .    ** value fr
1b680 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  om sqlite3FaultS
1b690 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68  im(0) becomes th
1b6a0 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20  e return from.  
1b6b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
1b6c0 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20  t_control()..   
1b6d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1b6e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
1b6f0 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20  LT_INSTALL: {.  
1b700 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
1b710 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
1b720 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
1b730 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
1b740 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
1b750 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
1b760 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
1b770 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
1b780 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c  lConfig.xTestCal
1b790 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61  lback = va_arg(a
1b7a0 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b  p, int(*)(int));
1b7b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b7c0 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53  typedef int(*TES
1b7d0 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1b7e0 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (int);.      sql
1b7f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1b800 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
1b810 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54   va_arg(ap, TEST
1b820 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b  CALLBACKFUNC_t);
1b830 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1b840 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a  te3FaultSim(0);.
1b850 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b860 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1b870 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1b880 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
1b890 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
1b8a0 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
1b8b0 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
1b8c0 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
1b8d0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
1b8e0 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
1b8f0 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
1b900 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
1b910 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1b920 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
1b930 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
1b940 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1b950 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
1b960 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
1b970 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1b980 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
1b990 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
1b9a0 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
1b9b0 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
1b9c0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1b9d0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
1b9e0 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
1b9f0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1ba00 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1ba10 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
1ba20 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
1ba30 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
1ba40 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
1ba50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1ba60 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1ba70 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1ba80 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1ba90 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
1baa0 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
1bab0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1bac0 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
1bad0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
1bae0 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
1baf0 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
1bb00 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
1bb10 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
1bb20 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
1bb30 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
1bb40 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
1bb50 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1bb60 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
1bb70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
1bb80 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
1bb90 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
1bba0 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
1bbb0 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
1bbc0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
1bbd0 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
1bbe0 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
1bbf0 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1bc00 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
1bc10 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
1bc20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
1bc30 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
1bc40 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
1bc50 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62  ** deleterious b
1bc60 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
1bc70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bc80 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
1bc90 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
1bca0 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
1bcb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1bcc0 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
1bcd0 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
1bce0 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
1bcf0 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
1bd00 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
1bd10 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
1bd20 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
1bd30 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
1bd40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1bd50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1bd60 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1bd70 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1bd80 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1bd90 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
1bda0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1bdb0 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1bdc0 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1bdd0 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
1bde0 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
1bdf0 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
1be00 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
1be10 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
1be20 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
1be30 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
1be40 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1be50 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1be60 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
1be70 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
1be80 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1be90 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1bea0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1beb0 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
1bec0 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
1bed0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1bee0 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
1bef0 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
1bf00 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
1bf10 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
1bf20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
1bf30 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1bf40 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
1bf50 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1bf60 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
1bf70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bf80 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
1bf90 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
1bfa0 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
1bfb0 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
1bfc0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
1bfd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
1bfe0 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
1bff0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1c000 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1c010 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1c020 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1c030 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
1c040 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1c050 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1c060 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1c070 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
1c080 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
1c090 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
1c0a0 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
1c0b0 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
1c0c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
1c0d0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
1c0e0 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
1c0f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
1c100 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
1c110 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
1c120 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
1c130 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
1c140 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
1c150 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
1c160 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1c170 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
1c180 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
1c190 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
1c1a0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1c1b0 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
1c1c0 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
1c1d0 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
1c1e0 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
1c1f0 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
1c200 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
1c210 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1c220 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
1c230 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
1c240 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
1c250 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1c260 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c270 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1c280 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
1c290 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
1c2a0 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
1c2b0 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
1c2c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1c2d0 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
1c2e0 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
1c2f0 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
1c300 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1c310 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
1c320 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
1c330 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1c340 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
1c350 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
1c360 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
1c370 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1c380 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
1c390 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1c3a0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1c3b0 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
1c3c0 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
1c3d0 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
1c3e0 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
1c3f0 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1c400 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
1c410 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1c420 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1c430 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1c440 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
1c450 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1c460 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
1c470 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
1c480 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
1c490 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
1c4a0 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
1c4b0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1c4c0 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
1c4d0 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
1c4e0 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1c4f0 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
1c500 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1c510 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1c520 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
1c530 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1c540 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
1c550 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
1c560 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c570 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1c580 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c590 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1c5a0 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29  TCTRL_BYTEORDER)
1c5b0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1c5c0 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75  The integer retu
1c5d0 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65  rned reveals the
1c5e0 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74   byte-order of t
1c5f0 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77  he computer on w
1c600 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69  hich.    ** SQLi
1c610 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20  te is running:. 
1c620 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1c630 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64     1     big-end
1c640 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
1c650 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1c660 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20     **      10   
1c670 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1c680 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1c690 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1c6a0 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65  432101     big-e
1c6b0 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d  ndian,    determ
1c6c0 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1c6d0 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33  time.    **  123
1c6e0 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65  410     little-e
1c6f0 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1c700 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1c710 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61  e.    */ .    ca
1c720 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c730 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a  RL_BYTEORDER: {.
1c740 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c750 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20  E_BYTEORDER*100 
1c760 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45  + SQLITE_LITTLEE
1c770 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54  NDIAN*10 + SQLIT
1c780 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20  E_BIGENDIAN;.   
1c790 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c7a0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1c7b0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1c7c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
1c7d0 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
1c7e0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1c7f0 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1c800 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
1c810 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
1c820 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
1c830 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
1c840 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
1c850 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c860 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1c870 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
1c880 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c890 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1c8a0 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
1c8b0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1c8c0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1c8d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1c8e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1c8f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1c900 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
1c910 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
1c920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1c930 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1c940 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
1c950 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c960 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
1c970 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1c980 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1c990 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
1c9a0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1c9b0 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
1c9c0 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
1c9d0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1c9e0 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
1c9f0 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
1ca00 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
1ca10 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
1ca20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
1ca30 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
1ca40 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
1ca50 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
1ca60 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
1ca70 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
1ca80 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
1ca90 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
1caa0 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
1cab0 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
1cac0 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
1cad0 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
1cae0 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
1caf0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1cb00 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
1cb10 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1cb20 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
1cb30 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
1cb40 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
1cb50 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1cb60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1cb70 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
1cb80 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1cb90 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1cba0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1cbb0 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d  db->dbOptFlags =
1cbc0 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70   (u16)(va_arg(ap
1cbd0 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29  , int) & 0xffff)
1cbe0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1cbf0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1cc00 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
1cc10 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
1cc20 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1cc30 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
1cc40 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
1cc50 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
1cc60 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
1cc70 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
1cc80 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
1cc90 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
1cca0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
1ccb0 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
1ccc0 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
1ccd0 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
1cce0 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
1ccf0 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
1cd00 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
1cd10 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
1cd20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
1cd30 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
1cd40 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
1cd50 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
1cd60 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1cd70 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
1cd80 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
1cd90 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
1cda0 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
1cdb0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1cdc0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
1cdd0 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
1cde0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
1cdf0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
1ce00 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
1ce10 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
1ce20 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
1ce30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
1ce40 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
1ce50 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
1ce60 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
1ce70 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
1ce80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ce90 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20   }.#endif ..    
1cea0 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
1ceb0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1cec0 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
1ced0 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
1cee0 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
1cef0 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
1cf00 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
1cf10 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
1cf20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
1cf30 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
1cf40 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
1cf50 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
1cf60 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1cf70 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
1cf80 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
1cf90 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
1cfa0 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
1cfb0 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
1cfc0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1cfd0 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
1cfe0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
1cff0 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
1d000 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1d010 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
1d020 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
1d030 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
1d040 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
1d050 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
1d060 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
1d070 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d080 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1d090 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d0a0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1d0b0 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
1d0c0 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
1d0d0 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
1d0e0 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
1d0f0 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
1d100 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
1d110 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
1d120 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1d130 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
1d140 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
1d150 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
1d160 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
1d170 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
1d180 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d190 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1d1a0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
1d1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1d1c0 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
1d1d0 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
1d1e0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1d1f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d200 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1d210 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1d220 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1d230 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e  EVER_CORRUPT, in
1d240 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
1d250 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
1d260 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
1d270 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61  ates that the da
1d280 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61  tabase file is a
1d290 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20  lways well-.    
1d2a0 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65  ** formed and ne
1d2b0 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68  ver corrupt.  Th
1d2c0 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  is flag is clear
1d2d0 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64   by default, ind
1d2e0 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20  icating that.   
1d2f0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1d300 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72  es might have ar
1d310 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69  bitrary corrupti
1d320 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  on.  Setting the
1d330 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20   flag during.   
1d340 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73   ** testing caus
1d350 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72  es certain asser
1d360 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
1d370 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65  n the code to be
1d380 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a   activated.    *
1d390 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61  * that demonstra
1d3a0 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20  t invariants on 
1d3b0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
1d3c0 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  base files..    
1d3d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d3e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1d3f0 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20  R_CORRUPT: {.   
1d400 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1d410 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72  Config.neverCorr
1d420 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  upt = va_arg(ap,
1d430 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1d440 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1d450 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1d460 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1d470 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1d480 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61  OVERAGE, xCallba
1d490 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a  ck, ptr);.    **
1d4a0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1d4b0 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61  VDBE coverage ca
1d4c0 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
1d4d0 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74  to xCallback wit
1d4e0 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  h context .    *
1d4f0 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20  * pointer ptr.. 
1d500 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1d510 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56  QLITE_TESTCTRL_V
1d520 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a  DBE_COVERAGE: {.
1d530 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
1d540 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20  BE_COVERAGE.    
1d550 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
1d560 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  *branch_callback
1d570 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75  )(void*,int,u8,u
1d580 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
1d590 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56  3GlobalConfig.xV
1d5a0 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61  dbeBranch = va_a
1d5b0 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c  rg(ap,branch_cal
1d5c0 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71  lback);.      sq
1d5d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d5e0 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67  g.pVdbeBranchArg
1d5f0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69   = va_arg(ap,voi
1d600 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  d*);.#endif.    
1d610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d620 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1d630 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1d640 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
1d650 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e  RTER_MMAP, db, n
1d660 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73  Max); */.    cas
1d670 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d680 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b  L_SORTER_MMAP: {
1d690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1d6a0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1d6b0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1d6c0 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d   db->nMaxSorterM
1d6d0 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  map = va_arg(ap,
1d6e0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1d6f0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d700 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1d710 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d720 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29  TESTCTRL_ISINIT)
1d730 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1d740 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1d750 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62   if SQLite has b
1d760 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
1d770 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  and SQLITE_ERROR
1d780 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a   if.    ** not..
1d790 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1d7a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d7b0 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20  ISINIT: {.      
1d7c0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1d7d0 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d  lConfig.isInit==
1d7e0 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
1d7f0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1d800 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d810 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1d820 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d830 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
1d840 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e  , db, dbName, on
1d850 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  Off, tnum);.    
1d860 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  **.    ** This t
1d870 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75  est control is u
1d880 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d  sed to create im
1d890 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1d8a0 22 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65  "db" is a pointe
1d8b0 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  r.    ** to the 
1d8c0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1d8d0 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20  ion.  dbName is 
1d8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1d8f0 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72  e (ex: "main" or
1d900 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20  .    ** "temp") 
1d910 77 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69  which will recei
1d920 76 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e  ve the imposter.
1d930 20 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20    "onOff" turns 
1d940 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e  imposter mode on
1d950 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20  .    ** or off. 
1d960 20 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72   "tnum" is the r
1d970 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1d980 62 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20  b-tree to which 
1d990 74 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20  the imposter.   
1d9a0 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64   ** table should
1d9b0 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a   connect..    **
1d9c0 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69  .    ** Enable i
1d9d0 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c  mposter mode onl
1d9e0 79 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  y when the schem
1d9f0 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
1da00 65 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e  en parsed.  Then
1da10 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69  .    ** run a si
1da20 6e 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c  ngle CREATE TABL
1da30 45 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63  E statement to c
1da40 6f 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70  onstruct the imp
1da50 6f 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20  oster table in. 
1da60 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64     ** the parsed
1da70 20 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74   schema.  Then t
1da80 75 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  urn imposter mod
1da90 65 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e  e back off again
1daa0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1dab0 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20  If onOff==0 and 
1dac0 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65  tnum>0 then rese
1dad0 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  t the schema for
1dae0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20   all databases, 
1daf0 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74  causing.    ** t
1db00 68 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20  he schema to be 
1db10 72 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78  reparsed the nex
1db20 74 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65  t time it is nee
1db30 64 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74  ded.  This has t
1db40 68 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74  he.    ** effect
1db50 20 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20   of erasing all 
1db60 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
1db70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1db80 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1db90 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20  _IMPOSTER: {.   
1dba0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1dbb0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1dbc0 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  te3*);.      sql
1dbd0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1dbe0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1dbf0 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20     db->init.iDb 
1dc00 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
1dc10 61 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61  ame(db, va_arg(a
1dc20 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b  p,const char*));
1dc30 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
1dc40 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
1dc50 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20  imposterTable = 
1dc60 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1dc70 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e        db->init.n
1dc80 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28  ewTnum = va_arg(
1dc90 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  ap,int);.      i
1dca0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1dcb0 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  ==0 && db->init.
1dcc0 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20  newTnum>0 ){.   
1dcd0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
1dce0 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
1dcf0 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20  nection(db);.   
1dd00 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1dd10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1dd20 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1dd30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1dd40 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
1dd50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1dd60 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
1dd70 53 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  ST */.  return r
1dd80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1dd90 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f   is a utility ro
1dda0 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f  utine, useful to
1ddb0 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1ddc0 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b  ions, that check
1ddd0 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61  s.** to see if a
1dde0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1ddf0 61 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f  as a URI that co
1de00 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66  ntained a specif
1de10 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72  ic query .** par
1de20 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73  ameter, and if s
1de30 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61  o obtains the va
1de40 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79  lue of the query
1de50 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
1de60 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1de70 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1de80 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72  filename pointer
1de90 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65   passed into the
1dea0 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68   xOpen().** meth
1deb0 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c  od of a VFS impl
1dec0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
1ded0 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74   zParam argument
1dee0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1def0 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72  the.** query par
1df00 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20  ameter we seek. 
1df10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1df20 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20  turns the value 
1df30 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a  of the zParam.**
1df40 20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74   parameter if it
1df50 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65   exists.  If the
1df60 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20   parameter does 
1df70 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20  not exist, this 
1df80 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
1df90 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ns a NULL pointe
1dfa0 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
1dfb0 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61   *sqlite3_uri_pa
1dfc0 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68  rameter(const ch
1dfd0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
1dfe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1dff0 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  m){.  if( zFilen
1e000 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d  ame==0 || zParam
1e010 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1e020 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1e030 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1e040 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1e050 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d   while( zFilenam
1e060 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
1e070 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  x = strcmp(zFile
1e080 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1e090 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
1e0a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1e0b0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
1e0c0 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72      if( x==0 ) r
1e0d0 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
1e0e0 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
1e0f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1e100 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1e110 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1e120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1e130 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  n a boolean valu
1e140 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
1e150 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rameter..*/.int 
1e160 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
1e170 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ean(const char *
1e180 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
1e190 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69   char *zParam, i
1e1a0 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e  nt bDflt){.  con
1e1b0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1e1c0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1e1d0 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
1e1e0 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d  aram);.  bDflt =
1e1f0 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74   bDflt!=0;.  ret
1e200 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47  urn z ? sqlite3G
1e210 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66  etBoolean(z, bDf
1e220 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a  lt) : bDflt;.}..
1e230 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36  /*.** Return a 6
1e240 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
1e250 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
1e260 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71  parameter..*/.sq
1e270 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1e280 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20  te3_uri_int64(. 
1e290 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1e2a0 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69  lename,    /* Fi
1e2b0 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64  lename as passed
1e2c0 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63   to xOpen */.  c
1e2d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1e2e0 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20  m,       /* URI 
1e2f0 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74  parameter sought
1e300 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1e310 74 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20  t64 bDflt       
1e320 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72  /* return if par
1e330 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e  ameter is missin
1e340 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  g */.){.  const 
1e350 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1e360 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1e370 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1e380 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  m);.  sqlite3_in
1e390 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26  t64 v;.  if( z &
1e3a0 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
1e3b0 78 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53  xToI64(z, &v)==S
1e3c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e3d0 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
1e3e0 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
1e3f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1e400 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
1e410 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
1e420 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
1e430 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1e440 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
1e450 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1e460 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1e470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1e480 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1e490 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1e4a0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
1e4b0 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
1e4c0 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d  .     && (zDbNam
1e4d0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
1e4e0 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  trICmp(zDbName, 
1e4f0 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
1e500 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
1e510 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44     return db->aD
1e520 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a  b[i].pBt;.    }.
1e530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1e540 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e550 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20  the filename of 
1e560 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1e570 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
1e580 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1e590 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
1e5a0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62  char *sqlite3_db
1e5b0 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65  _filename(sqlite
1e5c0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1e5d0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1e5e0 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65  tree *pBt;.#ifde
1e5f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1e600 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1e610 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1e620 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
1e630 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
1e640 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
1e650 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
1e660 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69  dif.  pBt = sqli
1e670 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1e680 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1e690 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1e6a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
1e6b0 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a  ename(pBt) : 0;.
1e6c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e6d0 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  1 if database is
1e6e0 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20   read-only or 0 
1e6f0 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  if read/write.  
1e700 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
1e710 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
1e720 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
1e730 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1e740 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nly(sqlite3 *db,
1e750 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1e760 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1e770 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  pBt;.#ifdef SQLI
1e780 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1e790 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1e7a0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1e7b0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
1e7c0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
1e7d0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
1e7e0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  -1;.  }.#endif. 
1e7f0 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62   pBt = sqlite3Db
1e800 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
1e810 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  zDbName);.  retu
1e820 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33  rn pBt ? sqlite3
1e830 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
1e840 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a           pBt) : -1;.}.