/ Hex Artifact Content
Login

Artifact ff612656f1c0e4676f5da919ecc8e39a8d7b857a:


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 41 74 6f 6d 69 63 61        /* Atomica
3650: 6c 6c 79 20 63 6f 6d 70 61 72 65 2d 61 6e 64 2d  lly compare-and-
3660: 73 77 61 70 20 74 68 65 20 6d 75 74 65 78 20 69  swap the mutex i
3670: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6f  mplementation po
3680: 69 6e 74 65 72 20 74 6f 0a 20 20 20 20 20 20 20  inter to.       
3690: 2a 20 68 65 6c 70 20 70 72 65 76 65 6e 74 20 61  * help prevent a
36a0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
36b0: 77 69 74 68 20 73 71 6c 69 74 65 33 4d 75 74 65  with sqlite3Mute
36c0: 78 49 6e 69 74 28 29 2e 20 2a 2f 0a 20 20 20 20  xInit(). */.    
36d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
36e0: 70 61 72 65 41 6e 64 53 77 61 70 28 28 76 6f 69  pareAndSwap((voi
36f0: 64 20 2a 20 76 6f 6c 61 74 69 6c 65 20 2a 29 26  d * volatile *)&
3700: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3710: 66 69 67 2e 70 4d 75 74 65 78 2c 0a 20 20 20 20  fig.pMutex,.    
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26              0, &
3740: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3750: 66 69 67 2e 6d 75 74 65 78 29 3d 3d 30 20 29 7b  fig.mutex)==0 ){
3760: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 70 65 63  .        /* Spec
3770: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
3780: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
3790: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
37a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
37b0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a  Config.mutex = *
37c0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
37d0: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
37e0: 2a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  *);.      }else{
37f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
3800: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3810: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3820: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
3830: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3840: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
3850: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3860: 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 34  E>0 /* IMP: R-14
3870: 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20 20  450-37597 */.   
3880: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3890: 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a  FIG_GETMUTEX: {.
38a0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
38b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75  e the current mu
38c0: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
38d0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f  on */.      *va_
38e0: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
38f0: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20  mutex_methods*) 
3900: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3910: 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20  onfig.mutex;.   
3920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3930: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
3940: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3950: 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f  ALLOC: {.      /
3960: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3970: 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68 65  -55594-21030 The
3980: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3990: 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b  ALLOC option tak
39a0: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
39b0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
39c0: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
39d0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
39e0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
39f0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3a00: 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20 54  ods structure. T
3a10: 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63  he argument spec
3a20: 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69 76  ifies alternativ
3a30: 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d 6c  e.      ** low-l
3a40: 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  evel memory allo
3a50: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3a60: 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  to be used in pl
3a70: 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72  ace of the memor
3a80: 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63  y.      ** alloc
3a90: 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 62  ation routines b
3aa0: 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65  uilt into SQLite
3ab0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3ac0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3ad0: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
3ae0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3af0: 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ds*);.      brea
3b00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3b10: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3b20: 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  GETMALLOC: {.   
3b30: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3b40: 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31 34  F: R-51213-46414
3b50: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
3b60: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70 74  IG_GETMALLOC opt
3b70: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
3b80: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
3b90: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
3ba0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
3bb0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20  stance of the.  
3bc0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d      ** sqlite3_m
3bd0: 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63  em_methods struc
3be0: 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74 65  ture. The sqlite
3bf0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3c00: 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20 20  ructure is.     
3c10: 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
3c20: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
3c30: 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c 6c  fined memory all
3c40: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3c50: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
3c60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3c70: 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20  ig.m.xMalloc==0 
3c80: 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44  ) sqlite3MemSetD
3c90: 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20  efault();.      
3ca0: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3cb0: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a  te3_mem_methods*
3cc0: 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ) = sqlite3Globa
3cd0: 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20  lConfig.m;.     
3ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3cf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3d00: 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20  NFIG_MEMSTATUS: 
3d10: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3d20: 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35 2d  NCE-OF: R-61275-
3d30: 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54 45  35157 The SQLITE
3d40: 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55  _CONFIG_MEMSTATU
3d50: 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  S option takes. 
3d60: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
3d70: 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20  rgument of type 
3d80: 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65 64  int, interpreted
3d90: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20 77   as a boolean, w
3da0: 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20 20  hich enables.   
3db0: 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c 65     ** or disable
3dc0: 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  s the collection
3dd0: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   of memory alloc
3de0: 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73  ation statistics
3df0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3e00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3e10: 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67  Memstat = va_arg
3e20: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3e40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3e50: 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a  NFIG_SCRATCH: {.
3e60: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3e70: 45 2d 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36 30  E-OF: R-08404-60
3e80: 38 38 37 20 54 68 65 72 65 20 61 72 65 20 74 68  887 There are th
3e90: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3ea0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3eb0: 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a  _CONFIG_SCRATCH:
3ec0: 20 41 20 70 6f 69 6e 74 65 72 20 61 6e 20 38 2d   A pointer an 8-
3ed0: 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d  byte aligned mem
3ee0: 6f 72 79 20 62 75 66 66 65 72 20 66 72 6f 6d 0a  ory buffer from.
3ef0: 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 74        ** which t
3f00: 68 65 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63  he scratch alloc
3f10: 61 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 64  ations will be d
3f20: 72 61 77 6e 2c 20 74 68 65 20 73 69 7a 65 20 6f  rawn, the size o
3f30: 66 20 65 61 63 68 20 73 63 72 61 74 63 68 0a 20  f each scratch. 
3f40: 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69       ** allocati
3f50: 6f 6e 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65  on (sz), and the
3f60: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3f70: 6f 66 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63  of scratch alloc
3f80: 61 74 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a 20  ations (N). */. 
3f90: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3fa0: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
3fb0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  h = va_arg(ap, v
3fc0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3fd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3fe0: 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f  .szScratch = va_
3ff0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4000: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4010: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
4020: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4030: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
4040: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4050: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41  SQLITE_CONFIG_PA
4060: 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20  GECACHE: {.     
4070: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
4080: 20 52 2d 33 31 34 30 38 2d 34 30 35 31 30 20 54   R-31408-40510 T
4090: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61  here are three a
40a0: 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20  rguments to.    
40b0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46    ** SQLITE_CONF
40c0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 41 20  IG_PAGECACHE: A 
40d0: 70 6f 69 6e 74 65 72 20 74 6f 20 38 2d 62 79 74  pointer to 8-byt
40e0: 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79  e aligned memory
40f0: 2c 20 74 68 65 20 73 69 7a 65 0a 20 20 20 20 20  , the size.     
4100: 20 2a 2a 20 6f 66 20 65 61 63 68 20 70 61 67 65   ** of each page
4110: 20 62 75 66 66 65 72 20 28 73 7a 29 2c 20 61 6e   buffer (sz), an
4120: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4130: 70 61 67 65 73 20 28 4e 29 2e 20 2a 2f 0a 20 20  pages (N). */.  
4140: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4150: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20  lConfig.pPage = 
4160: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
4170: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4180: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50  GlobalConfig.szP
4190: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
41a0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
41b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
41c0: 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28  .nPage = va_arg(
41d0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
41e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
41f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4200: 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a  FIG_PCACHE_HDRSZ
4210: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
4220: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30  DENCE-OF: R-3910
4230: 30 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49  0-27317 The SQLI
4240: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
4250: 5f 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61  _HDRSZ option ta
4260: 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  kes.      ** a s
4270: 69 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20  ingle parameter 
4280: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
4290: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
42a0: 20 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f   and writes into
42b0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69  .      ** that i
42c0: 6e 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65  nteger the numbe
42d0: 72 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73  r of extra bytes
42e0: 20 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72   per page requir
42f0: 65 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ed for each page
4300: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c  .      ** in SQL
4310: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43  ITE_CONFIG_PAGEC
4320: 41 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a  ACHE. */.      *
4330: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
4340: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71   = .          sq
4350: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42  lite3HeaderSizeB
4360: 74 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20  tree() +.       
4370: 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72     sqlite3Header
4380: 53 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20  SizePcache() +. 
4390: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
43a0: 48 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65  HeaderSizePcache
43b0: 31 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1();.      break
43c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
43d0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
43e0: 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  PCACHE: {.      
43f0: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
4400: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4410: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4420: 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a  ONFIG_GETPCACHE:
4430: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20   {.      /* now 
4440: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
4450: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
4460: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
4470: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
4480: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4490: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
44a0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
44b0: 20 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54   R-63325-48378 T
44c0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
44d0: 5f 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20  _PCACHE2 option 
44e0: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
44f0: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4500: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
4510: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
4520: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4530: 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  2.      ** objec
4540: 74 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73  t. This object s
4550: 70 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74  pecifies the int
4560: 65 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74  erface to a cust
4570: 6f 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20  om page cache.  
4580: 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
4590: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
45a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
45b0: 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76  fig.pcache2 = *v
45c0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
45d0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
45e0: 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  2*);.      break
45f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4600: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
4610: 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  ETPCACHE2: {.   
4620: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
4630: 46 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32  F: R-22035-46182
4640: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
4650: 49 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70  IG_GETPCACHE2 op
4660: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
4670: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
4680: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
4690: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
46a0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
46b0: 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20  thods2.      ** 
46c0: 6f 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63  object. SQLite c
46d0: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72  opies of the cur
46e0: 72 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20  rent page cache 
46f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
4700: 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nto.      ** tha
4710: 74 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20  t object. */.   
4720: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
4730: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4740: 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  e2.xInit==0 ){. 
4750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43         sqlite3PC
4760: 61 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29  acheSetDefault()
4770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4780: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
4790: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
47a0: 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ds2*) = sqlite3G
47b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
47c0: 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  he2;.      break
47d0: 3b 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44  ;.    }../* EVID
47e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36  ENCE-OF: R-06626
47f0: 2d 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54  -12911 The SQLIT
4800: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70  E_CONFIG_HEAP op
4810: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  tion is only.** 
4820: 61 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c  available if SQL
4830: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
4840: 77 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49  with either SQLI
4850: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
4860: 33 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  3 or.** SQLITE_E
4870: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e  NABLE_MEMSYS5 an
4880: 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
4890: 5f 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65  _ERROR if invoke
48a0: 64 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a  d otherwise. */.
48b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
48c0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
48d0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
48e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
48f0: 59 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51  YS5).    case SQ
4900: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50  LITE_CONFIG_HEAP
4910: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
4920: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35  DENCE-OF: R-1985
4930: 34 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72  4-42126 There ar
4940: 65 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74  e three argument
4950: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51  s to.      ** SQ
4960: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50  LITE_CONFIG_HEAP
4970: 3a 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67  : An 8-byte alig
4980: 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ned pointer to t
4990: 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20  he memory, the. 
49a0: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f       ** number o
49b0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
49c0: 65 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e  emory buffer, an
49d0: 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  d the minimum al
49e0: 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20  location size.. 
49f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
4a00: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4a10: 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.pHeap = va_arg
4a20: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
4a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4a40: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76  Config.nHeap = v
4a50: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4a70: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
4a80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4a90: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71  );..      if( sq
4aa0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4ab0: 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20  g.mnReq<1 ){.   
4ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4ad0: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4ae0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
4af0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4b00: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31  lConfig.mnReq>(1
4b10: 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20  <<12) ){.       
4b20: 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75   /* cap min requ
4b30: 65 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32  est size at 2^12
4b40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
4b50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4b60: 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b  mnReq = (1<<12);
4b70: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4b80: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4b90: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30  lConfig.pHeap==0
4ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
4bb0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
4bc0: 39 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65  920-60189 If the
4bd0: 20 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28   first pointer (
4be0: 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74  the memory point
4bf0: 65 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  er).        ** i
4c00: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c  s NULL, then SQL
4c10: 69 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75  ite reverts to u
4c20: 73 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74  sing its default
4c30: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f   memory allocato
4c40: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68  r.        ** (th
4c50: 65 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28  e system malloc(
4c60: 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ) implementation
4c70: 29 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70  ), undoing any p
4c80: 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rior invocation 
4c90: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51  of.        ** SQ
4ca0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
4cb0: 4f 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  OC..        **. 
4cc0: 20 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e         ** Settin
4cd0: 67 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g sqlite3GlobalC
4ce0: 6f 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a  onfig.m to all z
4cf0: 65 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20  eros will cause 
4d00: 6d 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20  malloc to.      
4d10: 20 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69    ** revert to i
4d20: 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65  ts default imple
4d30: 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73  mentation when s
4d40: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
4d50: 65 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20  e() is run.     
4d60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
4d70: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f  mset(&sqlite3Glo
4d80: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20  balConfig.m, 0, 
4d90: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
4da0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a  obalConfig.m));.
4db0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4dc0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
4dd0: 2d 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39  -OF: R-61006-089
4de0: 31 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79  18 If the memory
4df0: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
4e00: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20  NULL then the.  
4e10: 20 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61        ** alterna
4e20: 74 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  tive memory allo
4e30: 63 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64  cator is engaged
4e40: 20 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f   to handle all o
4e50: 66 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20  f SQLites.      
4e60: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
4e70: 63 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f  cation needs. */
4e80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4e90: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20  NABLE_MEMSYS3.  
4ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4eb0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73  balConfig.m = *s
4ec0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
4ed0: 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ys3();.#endif.#i
4ee0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4ef0: 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20  LE_MEMSYS5.     
4f00: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4f10: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
4f20: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35  te3MemGetMemsys5
4f30: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ();.#endif.     
4f40: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4f50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
4f60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4f70: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20  NFIG_LOOKASIDE: 
4f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
4f90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
4fa0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
4fb0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4fc0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4fd0: 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20  nfig.nLookaside 
4fe0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4ff0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5000: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f      }.    .    /
5010: 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  * Record a point
5020: 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72  er to the logger
5030: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74   function and it
5040: 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  s first argument
5050: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66  ..    ** The def
5060: 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c  ault is NULL.  L
5070: 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c  ogging is disabl
5080: 65 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ed if the functi
5090: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20  on pointer is.  
50a0: 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a    ** NULL..    *
50b0: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
50c0: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a  E_CONFIG_LOG: {.
50d0: 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
50e0: 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
50f0: 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
5100: 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
5110: 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
5120: 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
5130: 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
5140: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
5150: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d  balConfig.xLog =
5160: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
5170: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  (*)(void*,int,co
5180: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
5190: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
51a0: 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e  def void(*LOGFUN
51b0: 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  C_t)(void*,int,c
51c0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
51d0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
51e0: 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61  Config.xLog = va
51f0: 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43  _arg(ap, LOGFUNC
5200: 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _t);.      sqlit
5210: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
5220: 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  LogArg = va_arg(
5230: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
5240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5250: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5260: 4f 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31  OF: R-55548-3381
5270: 37 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69  7 The compile-ti
5280: 6d 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55  me setting for U
5290: 52 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20  RI filenames.   
52a0: 20 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67   ** can be chang
52b0: 65 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65  ed at start-time
52c0: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a   using the.    *
52d0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
52e0: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55  (SQLITE_CONFIG_U
52f0: 52 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20  RI,1) or.    ** 
5300: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
5310: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
5320: 2c 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ,0) configuratio
5330: 6e 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a  n calls..    */.
5340: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5350: 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20  CONFIG_URI: {.  
5360: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5370: 4f 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32  OF: R-25451-6112
5380: 35 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  5 The SQLITE_CON
5390: 46 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74  FIG_URI option t
53a0: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20  akes a single.  
53b0: 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20      ** argument 
53c0: 6f 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20  of type int. If 
53d0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55  non-zero, then U
53e0: 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67  RI handling is g
53f0: 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  lobally.      **
5400: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65   enabled. If the
5410: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65   parameter is ze
5420: 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e  ro, then URI han
5430: 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c  dling is globall
5440: 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62  y.      ** disab
5450: 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  led. */.      sq
5460: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5470: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
5480: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
5490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
54a0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
54b0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
54c0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
54d0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
54e0: 45 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32  E-OF: R-36592-02
54f0: 37 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43  772 The SQLITE_C
5500: 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49  ONFIG_COVERING_I
5510: 4e 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20  NDEX_SCAN.      
5520: 2a 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  ** option takes 
5530: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
5540: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
5550: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
5560: 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f  s a.      ** boo
5570: 6c 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  lean in order to
5580: 20 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   enable or disab
5590: 6c 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f  le the use of co
55a0: 76 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66  vering indices f
55b0: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  or.      ** full
55c0: 20 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20   table scans in 
55d0: 74 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  the query optimi
55e0: 7a 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  zer. */.      sq
55f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5600: 67 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61  g.bUseCis = va_a
5610: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5630: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5640: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20  NABLE_SQLLOG.   
5650: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5660: 46 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20  FIG_SQLLOG: {.  
5670: 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
5680: 28 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28  (*SQLLOGFUNC_t)(
5690: 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  void*, sqlite3*,
56a0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
56b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
56c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
56d0: 71 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  qllog = va_arg(a
56e0: 70 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29  p, SQLLOGFUNC_t)
56f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5700: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
5710: 6c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  logArg = va_arg(
5720: 61 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20  ap, void *);.   
5730: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5740: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
5750: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5760: 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
5770: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
5780: 3a 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20  : R-58063-38258 
5790: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
57a0: 41 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77  AP_SIZE takes tw
57b0: 6f 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  o 64-bit.      *
57c0: 2a 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74  * integer (sqlit
57d0: 65 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73  e3_int64) values
57e0: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65   that are the de
57f0: 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20  fault mmap size 
5800: 6c 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28  limit.      ** (
5810: 74 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  the default sett
5820: 69 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d  ing for PRAGMA m
5830: 6d 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68  map_size) and th
5840: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5850: 64 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20  d.      ** mmap 
5860: 73 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20  size limit. */. 
5870: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
5880: 36 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61  64 szMmap = va_a
5890: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69  rg(ap, sqlite3_i
58a0: 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt64);.      sql
58b0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61  ite3_int64 mxMma
58c0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  p = va_arg(ap, s
58d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20  qlite3_int64);. 
58e0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
58f0: 2d 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31  -OF: R-53367-431
5900: 39 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67  90 If either arg
5910: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70  ument to this op
5920: 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  tion is.      **
5930: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
5940: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73  that argument is
5950: 20 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20   changed to its 
5960: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66  compile-time def
5970: 61 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ault..      **. 
5980: 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
5990: 2d 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30  -OF: R-34993-450
59a0: 33 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61  31 The maximum a
59b0: 6c 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65  llowed mmap size
59c0: 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a   will be.      *
59d0: 2a 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63  * silently trunc
59e0: 61 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  ated if necessar
59f0: 79 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  y so that it doe
5a00: 73 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65  s not exceed the
5a10: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
5a20: 65 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d  e-time maximum m
5a30: 6d 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20  map size set by 
5a40: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  the SQLITE_MAX_M
5a50: 4d 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a  MAP_SIZE.      *
5a60: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
5a70: 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
5a80: 20 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70        if( mxMmap
5a90: 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c  <0 || mxMmap>SQL
5aa0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
5ab0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d  E ){.        mxM
5ac0: 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  map = SQLITE_MAX
5ad0: 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20  _MMAP_SIZE;.    
5ae0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a    }.      if( sz
5af0: 4d 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20  Mmap<0 ) szMmap 
5b00: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
5b10: 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20  _MMAP_SIZE;.    
5b20: 20 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d    if( szMmap>mxM
5b30: 6d 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78  map) szMmap = mx
5b40: 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mmap;.      sqli
5b50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5b60: 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b  mxMmap = mxMmap;
5b70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5b80: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
5b90: 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20  p = szMmap;.    
5ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5bb0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
5bc0: 4e 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  N && defined(SQL
5bd0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
5be0: 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38  ) /* IMP: R-0478
5bf0: 30 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63  0-55815 */.    c
5c00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5c10: 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45  G_WIN32_HEAPSIZE
5c20: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
5c30: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32  DENCE-OF: R-3492
5c40: 36 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43  6-03360 SQLITE_C
5c50: 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50  ONFIG_WIN32_HEAP
5c60: 53 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d  SIZE takes a 32-
5c70: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  bit.      ** uns
5c80: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61  igned integer va
5c90: 6c 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69  lue that specifi
5ca0: 65 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  es the maximum s
5cb0: 69 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74  ize of the creat
5cc0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70  ed.      ** heap
5cd0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
5ce0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
5cf0: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
5d00: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
5d10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5d20: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
5d30: 54 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a  TE_CONFIG_PMASZ:
5d40: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5d50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50  GlobalConfig.szP
5d60: 6d 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ma = va_arg(ap, 
5d70: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
5d80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5d90: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
5da0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5db0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
5dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5dd0: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
5de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5df0: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
5e00: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5e10: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
5e20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
5e30: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5e40: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
5e50: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
5e60: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
5e70: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
5e80: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
5e90: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
5ea0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5eb0: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
5ec0: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
5ed0: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
5ee0: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5ef0: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
5f00: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
5f10: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
5f20: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
5f30: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
5f40: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
5f50: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
5f60: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
5f70: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
5f80: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
5f90: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
5fa0: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
5fb0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
5fc0: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
5fd0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
5fe0: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
5ff0: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66  z, int cnt){.#if
6000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6010: 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69  _LOOKASIDE.  voi
6020: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
6030: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
6040: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
6050: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
6060: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
6070: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
6080: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
6090: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
60a0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
60b0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
60c0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
60d0: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
60e0: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
60f0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
6100: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6110: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6130: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6140: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6150: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
6160: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
6170: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
6180: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
6190: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
61a0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
61b0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
61c0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
61d0: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
61e0: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
61f0: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
6200: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
6210: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
6220: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
6230: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
6240: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
6250: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
6260: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
6270: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
6280: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
6290: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
62a0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
62b0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
62c0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
62d0: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
62e0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
62f0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
6300: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
6310: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6320: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
6330: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6340: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
6350: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
6360: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
6370: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
6380: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
6390: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
63a0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
63b0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
63c0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
63d0: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
63e0: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
63f0: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6400: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
6410: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
6420: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
6430: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
6440: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
6450: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
6460: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
6470: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
6480: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
6490: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
64a0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
64b0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
64c0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
64d0: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
64e0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
64f0: 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62  bled = 1;.    db
6500: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6510: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
6520: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
6530: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6540: 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20  .pStart = db;.  
6550: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6560: 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64  pEnd = db;.    d
6570: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
6580: 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64  abled = 0;.    d
6590: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
65a0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
65b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
65c0: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20  _OMIT_LOOKASIDE 
65d0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
65e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
65f0: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
6600: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6610: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
6620: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
6630: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
6640: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
6650: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
6660: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
6670: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
6680: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
6690: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
66a0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
66b0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
66c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
66d0: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  f.  return db->m
66e0: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
66f0: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
6700: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
6710: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
6720: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
6730: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
6740: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
6750: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
6760: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  *db){.  int i;..
6770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6780: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
6790: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
67a0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
67b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
67c0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
67d0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
67e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
67f0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6800: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6810: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6820: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6830: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6840: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6850: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
6860: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
6870: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
6880: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
6890: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
68a0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
68b0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
68c0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
68d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
68e0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
68f0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
6900: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6910: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
6920: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
6930: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
6940: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
6950: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6960: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
6970: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
6980: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6990: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
69a0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
69b0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
69c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
69d0: 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  BCONFIG_LOOKASID
69e0: 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  E: {.      void 
69f0: 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61  *pBuf = va_arg(a
6a00: 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d  p, void*); /* IM
6a10: 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34  P: R-26835-10964
6a20: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
6a30: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6a40: 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50  t);       /* IMP
6a50: 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20  : R-47871-25994 
6a60: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
6a70: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6a80: 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  t);      /* IMP:
6a90: 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a   R-04460-53386 *
6aa0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74  /.      rc = set
6ab0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
6ac0: 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a  pBuf, sz, cnt);.
6ad0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6ae0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6af0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
6b00: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
6b10: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
6b20: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6b30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
6b40: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b  mask;    /* Mask
6b50: 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73   of the bit in s
6b60: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20  qlite3.flags to 
6b70: 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20  set/clear */.   
6b80: 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d     } aFlagOp[] =
6b90: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c   {.        { SQL
6ba0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
6bb0: 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c  BLE_FKEY,    SQL
6bc0: 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20  ITE_ForeignKeys 
6bd0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
6be0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6bf0: 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20  ENABLE_TRIGGER, 
6c00: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
6c10: 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d  gger  },.      }
6c20: 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  ;.      unsigned
6c30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63   int i;.      rc
6c40: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
6c50: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30   /* IMP: R-42790
6c60: 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20  -23372 */.      
6c70: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
6c80: 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69  Size(aFlagOp); i
6c90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
6ca0: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d   aFlagOp[i].op==
6cb0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  op ){.          
6cc0: 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61  int onoff = va_a
6cd0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
6ce0: 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73         int *pRes
6cf0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6d00: 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t*);.          i
6d10: 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62  nt oldFlags = db
6d20: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  ->flags;.       
6d30: 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29     if( onoff>0 )
6d40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  {.            db
6d50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67  ->flags |= aFlag
6d60: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
6d70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6d80: 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  onoff==0 ){.    
6d90: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
6da0: 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d  s &= ~aFlagOp[i]
6db0: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
6dc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
6dd0: 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66   oldFlags!=db->f
6de0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
6df0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
6e00: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
6e10: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
6e20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
6e30: 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20  f( pRes ){.     
6e40: 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28         *pRes = (
6e50: 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61  db->flags & aFla
6e60: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b  gOp[i].mask)!=0;
6e70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6e80: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6e90: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
6ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6eb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6ed0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
6ee0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
6ef0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
6f00: 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  e if the buffer 
6f10: 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69  z[0..n-1] contai
6f20: 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a  ns all spaces..*
6f30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
6f40: 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61  Spaces(const cha
6f50: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
6f60: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b  while( n>0 && z[
6f70: 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d  n-1]==' ' ){ n--
6f80: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d  ; }.  return n==
6f90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
6fa0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
6fb0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
6fc0: 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59  on named "BINARY
6fd0: 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79  " which is alway
6fe0: 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a  s.** available..
6ff0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64  **.** If the pad
7000: 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
7010: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73   not NULL then s
7020: 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20  pace padding at 
7030: 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74  the end.** of st
7040: 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64  rings is ignored
7050: 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e  .  This implemen
7060: 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c  ts the RTRIM col
7070: 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lation..*/.stati
7080: 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e  c int binCollFun
7090: 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c  c(.  void *padFl
70a0: 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ag,.  int nKey1,
70b0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
70c0: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
70d0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
70e0: 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  y2.){.  int rc, 
70f0: 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e  n;.  n = nKey1<n
7100: 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e  Key2 ? nKey1 : n
7110: 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45  Key2;.  /* EVIDE
7120: 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d  NCE-OF: R-65033-
7130: 32 38 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d  28449 The built-
7140: 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74  in BINARY collat
7150: 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a  ion compares.  *
7160: 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65 20 62  * strings byte b
7170: 79 20 62 79 74 65 20 75 73 69 6e 67 20 74 68 65  y byte using the
7180: 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69   memcmp() functi
7190: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  on from the stan
71a0: 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72  dard C.  ** libr
71b0: 61 72 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6d  ary. */.  rc = m
71c0: 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
71d0: 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
71e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
71f0: 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61  adFlag.     && a
7200: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
7210: 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31  )pKey1)+n, nKey1
7220: 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  -n).     && allS
7230: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
7240: 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29  ey2)+n, nKey2-n)
7250: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
7260: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
7270: 33 31 36 32 34 2d 32 34 37 33 37 20 52 54 52 49  31624-24737 RTRI
7280: 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59  M is like BINARY
7290: 20 65 78 63 65 70 74 20 74 68 61 74 20 65 78 74   except that ext
72a0: 72 61 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63  ra.      ** spac
72b0: 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  es at the end of
72c0: 20 65 69 74 68 65 72 20 73 74 72 69 6e 67 20 64   either string d
72d0: 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
72e0: 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65   result. In othe
72f0: 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73  r.      ** words
7300: 2c 20 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63  , strings will c
7310: 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
7320: 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c  one another as l
7330: 6f 6e 67 20 61 73 20 74 68 65 79 0a 20 20 20 20  ong as they.    
7340: 20 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79    ** differ only
7350: 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   in the number o
7360: 66 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20  f spaces at the 
7370: 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  end..      */.  
7380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
7390: 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79  c = nKey1 - nKey
73a0: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  2;.    }.  }.  r
73b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
73c0: 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74  ** Another built
73d0: 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  -in collating se
73e0: 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20  quence: NOCASE. 
73f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c  .**.** This coll
7400: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
7410: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
7420: 20 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20   used for "case 
7430: 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63  independent.** c
7440: 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69  omparison". SQLi
7450: 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f  te's knowledge o
7460: 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  f upper and lowe
7470: 72 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e  r case equivalen
7480: 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e  ts.** extends on
7490: 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61  ly to the 26 cha
74a0: 72 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20  racters used in 
74b0: 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  the English lang
74c0: 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74  uage..**.** At t
74d0: 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20  he moment there 
74e0: 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20  is only a UTF-8 
74f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
7500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
7510: 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
7520: 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  c(.  void *NotUs
7530: 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ed,.  int nKey1,
7540: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
7550: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
7560: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
7570: 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20  y2.){.  int r = 
7580: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
7590: 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68  .      (const ch
75a0: 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e  ar *)pKey1, (con
75b0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c  st char *)pKey2,
75c0: 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e   (nKey1<nKey2)?n
75d0: 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55  Key1:nKey2);.  U
75e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
75f0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
7600: 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20  0==r ){.    r = 
7610: 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d  nKey1-nKey2;.  }
7620: 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a  .  return r;.}..
7630: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7640: 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f   ROWID of the mo
7650: 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74  st recent insert
7660: 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34  .*/.sqlite_int64
7670: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
7680: 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74  sert_rowid(sqlit
7690: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
76a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
76b0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
76c0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
76d0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
76e0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
76f0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
7700: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
7710: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c  f.  return db->l
7720: 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  astRowid;.}../*.
7730: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
7740: 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
7750: 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  in the most rece
7760: 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  nt call to sqlit
7770: 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e  e3_exec()..*/.in
7780: 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  t sqlite3_change
7790: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
77a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
77b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
77c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
77d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
77e0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
77f0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7800: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7810: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
7820: 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d  n db->nChange;.}
7830: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7840: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
7850: 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64  nges since the d
7860: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
7870: 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e  as opened..*/.in
7880: 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  t sqlite3_total_
7890: 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  changes(sqlite3 
78a0: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
78b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
78c0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
78d0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
78e0: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
78f0: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
7900: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
7910: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
7920: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74   return db->nTot
7930: 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  alChange;.}../*.
7940: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65  ** Close all ope
7950: 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68  n savepoints. Th
7960: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  is function only
7970: 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65   manipulates fie
7980: 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  lds of the.** da
7990: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62  tabase handle ob
79a0: 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f  ject, it does no
79b0: 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65  t close any save
79c0: 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20  points that may 
79d0: 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68  be open.** at th
79e0: 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c  e b-tree/pager l
79f0: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
7a00: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
7a10: 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ints(sqlite3 *db
7a20: 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e  ){.  while( db->
7a30: 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
7a40: 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d    Savepoint *pTm
7a50: 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  p = db->pSavepoi
7a60: 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76  nt;.    db->pSav
7a70: 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
7a80: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
7a90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70  3DbFree(db, pTmp
7aa0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61  );.  }.  db->nSa
7ab0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64  vepoint = 0;.  d
7ac0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
7ad0: 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73  0;.  db->isTrans
7ae0: 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20  actionSavepoint 
7af0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
7b00: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
7b10: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  tor function ass
7b20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e  ociated with Fun
7b30: 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20  cDef p, if any. 
7b40: 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68  Except,.** if th
7b50: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  is is not the la
7b60: 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  st copy of the f
7b70: 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  unction, do not 
7b80: 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69  invoke it. Multi
7b90: 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66  ple.** copies of
7ba0: 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69   a single functi
7bb0: 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77  on are created w
7bc0: 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74  hen create_funct
7bd0: 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a  ion() is called.
7be0: 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41  ** with SQLITE_A
7bf0: 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  NY as the encodi
7c00: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
7c10: 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72  id functionDestr
7c20: 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oy(sqlite3 *db, 
7c30: 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46  FuncDef *p){.  F
7c40: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
7c50: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e  Destructor = p->
7c60: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69  pDestructor;.  i
7c70: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
7c80: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
7c90: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  r->nRef--;.    i
7ca0: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  f( pDestructor->
7cb0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
7cc0: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44   pDestructor->xD
7cd0: 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74  estroy(pDestruct
7ce0: 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a  or->pUserData);.
7cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7d00: 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63  ree(db, pDestruc
7d10: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tor);.    }.  }.
7d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e  }../*.** Disconn
7d30: 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ect all sqlite3_
7d40: 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61  vtab objects tha
7d50: 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61  t belong to data
7d60: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
7d70: 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63  ** db. This is c
7d80: 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73  alled when db is
7d90: 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a   being closed..*
7da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
7db0: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
7dc0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7dd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7de0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
7df0: 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45 6c   int i;.  HashEl
7e00: 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  em *p;.  sqlite3
7e10: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
7e20: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
7e30: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
7e40: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
7e50: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
7e60: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
7e70: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
7e80: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ema ){.      for
7e90: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
7ea0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  st(&pSchema->tbl
7eb0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
7ec0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
7ed0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
7ee0: 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73  Tab = (Table *)s
7ef0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
7f00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  ;.        if( Is
7f10: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
7f20: 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f  sqlite3VtabDisco
7f30: 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b  nnect(db, pTab);
7f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7f50: 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69 74   }.  for(p=sqlit
7f60: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
7f70: 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d 73  aModule); p; p=s
7f80: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
7f90: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
7fa0: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
7fb0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
7fc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
7fd0: 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20 20 20 20  >pEpoTab ){.    
7fe0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73    sqlite3VtabDis
7ff0: 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f 64  connect(db, pMod
8000: 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20 20 20  ->pEpoTab);.    
8010: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
8020: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
8030: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
8040: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23  eLeaveAll(db);.#
8050: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
8060: 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e  RAMETER(db);.#en
8070: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
8080: 75 72 6e 20 54 52 55 45 20 69 66 20 64 61 74 61  urn TRUE if data
8090: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
80a0: 64 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a  db has unfinaliz
80b0: 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ed prepared.** s
80c0: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
80d0: 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f  inished sqlite3_
80e0: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20  backup objects. 
80f0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
8100: 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79  connectionIsBusy
8110: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8120: 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74   int j;.  assert
8130: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8140: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
8150: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  );.  if( db->pVd
8160: 62 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  be ) return 1;. 
8170: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
8180: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42  nDb; j++){.    B
8190: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
81a0: 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[j].pBt;.    
81b0: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74  if( pBt && sqlit
81c0: 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75  e3BtreeIsInBacku
81d0: 70 28 70 42 74 29 20 29 20 72 65 74 75 72 6e 20  p(pBt) ) return 
81e0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
81f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
8200: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51  e an existing SQ
8210: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f  Lite database.*/
8220: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8230: 74 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  te3Close(sqlite3
8240: 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a   *db, int forceZ
8250: 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64  ombie){.  if( !d
8260: 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  b ){.    /* EVID
8270: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37  ENCE-OF: R-63257
8280: 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73  -11740 Calling s
8290: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f  qlite3_close() o
82a0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
82b0: 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68  _close_v2() with
82c0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
82d0: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61  argument is a ha
82e0: 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f  rmless no-op. */
82f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8300: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
8310: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
8320: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
8330: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8340: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
8350: 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
8360: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
8370: 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46  >mutex);..  /* F
8380: 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74  orce xDisconnect
8390: 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69   calls on all vi
83a0: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a  rtual tables */.
83b0: 20 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56    disconnectAllV
83c0: 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  tab(db);..  /* I
83d0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
83e0: 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73  is open, the dis
83f0: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29  connectAllVtab()
8400: 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a   call above.  **
8410: 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63   will not have c
8420: 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f  alled the xDisco
8430: 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f  nnect() method o
8440: 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20  n any virtual.  
8450: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
8460: 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61   db->aVTrans[] a
8470: 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  rray. The follow
8480: 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62 52  ing sqlite3VtabR
8490: 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63  ollback().  ** c
84a0: 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20  all will do so. 
84b0: 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68  We need to do th
84c0: 69 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 68  is before the ch
84d0: 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20  eck for active. 
84e0: 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
84f0: 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65  ts below, as the
8500: 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65   v-table impleme
8510: 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73  ntation may be s
8520: 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65  toring.  ** some
8530: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
8540: 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  ents internally.
8550: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
8560: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
8570: 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65  ..  /* Legacy be
8580: 68 61 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f  havior (sqlite3_
8590: 63 6c 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72  close() behavior
85a0: 29 20 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20  ) is to return. 
85b0: 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   ** SQLITE_BUSY 
85c0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
85d0: 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f  n can not be clo
85e0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  sed immediately.
85f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72  .  */.  if( !for
8600: 63 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e  ceZombie && conn
8610: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29  ectionIsBusy(db)
8620: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8630: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
8640: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
8650: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
8660: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
8670: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
8680: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
8690: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
86a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
86b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
86c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
86d0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
86e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
86f0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
8700: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
8710: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
8720: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20  .    /* Closing 
8730: 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72  the handle. Four
8740: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
8750: 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
8760: 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74   2. */.    sqlit
8770: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
8780: 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c  Sqllog(sqlite3Gl
8790: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
87a0: 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29  ogArg, db, 0, 2)
87b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
87c0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63  /* Convert the c
87d0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  onnection into a
87e0: 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e   zombie and then
87f0: 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a   close it..  */.
8800: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
8810: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
8820: 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76  E;.  sqlite3Leav
8830: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
8840: 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75  mbie(db);.  retu
8850: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8860: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61  ./*.** Two varia
8870: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62  tions on the pub
8880: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f  lic interface fo
8890: 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61  r closing a data
88a0: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
88b0: 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  on. The sqlite3_
88c0: 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20  close() version 
88d0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
88e0: 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65  USY and.** leave
88f0: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
8900: 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65   option if there
8910: 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64   are unfinalized
8920: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
8930: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
8940: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
8950: 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69  ckups.  The sqli
8960: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a  te3_close_v2().*
8970: 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73  * version forces
8980: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8990: 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62  to become a zomb
89a0: 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  ie if there are.
89b0: 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f  ** unclosed reso
89c0: 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e  urces, and arran
89d0: 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ges for dealloca
89e0: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61  tion when the la
89f0: 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74  st.** prepare st
8a00: 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74  atement or sqlit
8a10: 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73  e3_backup closes
8a20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8a30: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
8a40: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
8a50: 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20  te3Close(db,0); 
8a60: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  }.int sqlite3_cl
8a70: 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a  ose_v2(sqlite3 *
8a80: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
8a90: 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20  te3Close(db,1); 
8aa0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
8ab0: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  the mutex on dat
8ac0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8ad0: 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68   db..**.** Furth
8ae0: 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62  ermore, if datab
8af0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
8b00: 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d  b is a zombie (m
8b10: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72  eaning that ther
8b20: 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20  e.** has been a 
8b30: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
8b40: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
8b50: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
8b60: 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20  _v2(db)) and.** 
8b70: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74  every sqlite3_st
8b80: 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  mt has now been 
8b90: 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76  finalized and ev
8ba0: 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ery sqlite3_back
8bb0: 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  up has.** finish
8bc0: 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c  ed, then free al
8bd0: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  l resources..*/.
8be0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76  void sqlite3Leav
8bf0: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
8c00: 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  mbie(sqlite3 *db
8c10: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
8c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8c30: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
8c40: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
8c50: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66   int j;..  /* If
8c60: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
8c70: 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73  anding sqlite3_s
8c80: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  tmt or sqlite3_b
8c90: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20  ackup objects.  
8ca0: 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e  ** or if the con
8cb0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  nection has not 
8cc0: 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20  yet been closed 
8cd0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  by sqlite3_close
8ce0: 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  _v2(),.  ** then
8cf0: 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20   just leave the 
8d00: 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e  mutex and return
8d10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
8d20: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
8d30: 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63  AGIC_ZOMBIE || c
8d40: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
8d50: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
8d60: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8d70: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
8d80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
8d90: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
8da0: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
8db0: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
8dc0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
8dd0: 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61  as.  ** closed a
8de0: 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ll sqlite3_stmt 
8df0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  and sqlite3_back
8e00: 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68  up objects and h
8e10: 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73  as been.  ** pas
8e20: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  sed to sqlite3_c
8e30: 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  lose (meaning th
8e40: 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69  at it is a zombi
8e50: 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a  e).  Therefore,.
8e60: 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
8e70: 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  d free all resou
8e80: 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  rces..  */..  /*
8e90: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
8ea0: 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20  n is open, roll 
8eb0: 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c  it back. This al
8ec0: 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  so ensures that 
8ed0: 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61  if.  ** any data
8ee0: 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76  base schemas hav
8ef0: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
8f00: 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65  by an uncommitte
8f10: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d transaction.  
8f20: 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65  ** they are rese
8f30: 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  t. And that the 
8f40: 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20  required b-tree 
8f50: 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f  mutex is held to
8f60: 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70   make.  ** the p
8f70: 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ager rollback an
8f80: 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61  d schema reset a
8f90: 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69  n atomic operati
8fa0: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
8fb0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
8fc0: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f  SQLITE_OK);..  /
8fd0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
8fe0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
8ff0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
9000: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
9010: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
9020: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
9030: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9040: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
9050: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
9060: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
9070: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
9080: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
9090: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
90a0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
90b0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
90c0: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
90d0: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
90e0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
90f0: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
9100: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
9110: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
9120: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
9130: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
9140: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
9150: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
9160: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
9170: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
9180: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
9190: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
91a0: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
91b0: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
91c0: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
91d0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
91e0: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
91f0: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
9200: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
9210: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
9220: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
9230: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
9240: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
9250: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
9260: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
9270: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
9280: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
9290: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
92a0: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
92b0: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
92c0: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
92d0: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
92e0: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
92f0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
9300: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
9310: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
9320: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
9330: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
9340: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
9350: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
9360: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
9370: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
9380: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
9390: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
93a0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
93b0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
93c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
93d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
93e0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
93f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
9400: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
9410: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9420: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
9430: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
9440: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
9450: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
9460: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
9470: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
9480: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
9490: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
94a0: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
94b0: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
94c0: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
94d0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
94e0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
94f0: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
9500: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
9510: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
9520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9530: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9540: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
9550: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
9560: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
9570: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
9580: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9590: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
95a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
95b0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
95c0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
95d0: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
95e0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
95f0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
9600: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
9610: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
9620: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
9630: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
9640: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9650: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
9660: 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d  ableClear(db, pM
9670: 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  od);.    sqlite3
9680: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
9690: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
96a0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
96b0: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
96c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
96d0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f  b, SQLITE_OK); /
96e0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
96f0: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
9700: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
9710: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
9720: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
9730: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
9740: 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54  s(db);.#if SQLIT
9750: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
9760: 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f  ATION.  sqlite3_
9770: 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41  free(db->auth.zA
9780: 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69  uthUser);.  sqli
9790: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74  te3_free(db->aut
97a0: 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64  h.zAuthPW);.#end
97b0: 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  if..  db->magic 
97c0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
97d0: 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  RROR;..  /* The 
97e0: 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63  temp-database sc
97f0: 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  hema is allocate
9800: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  d differently fr
9810: 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68  om the other sch
9820: 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ema.  ** objects
9830: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61   (using sqliteMa
9840: 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c  lloc() directly,
9850: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
9860: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29  te3BtreeSchema()
9870: 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65  )..  ** So it ne
9880: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
9890: 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20  here. Todo: Why 
98a0: 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d  not roll the tem
98b0: 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20  p schema into.  
98c0: 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69  ** the same sqli
98d0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68  teMalloc() as th
98e0: 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63  e one that alloc
98f0: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
9900: 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  e .  ** structur
9910: 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e?.  */.  sqlite
9920: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
9930: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
9940: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9950: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9960: 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  );.  db->magic =
9970: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
9980: 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OSED;.  sqlite3_
9990: 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d  mutex_free(db->m
99a0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
99b0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
99c0: 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61  Out==0 );  /* Fa
99d0: 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69  ils on a lookasi
99e0: 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a  de memory leak *
99f0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
9a00: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
9a10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
9a20: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
9a30: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
9a40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
9a50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
9a60: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
9a70: 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69  e files.  If tri
9a80: 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
9a90: 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20  ITE_OK, then.** 
9aa0: 61 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  any write cursor
9ab0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
9ac0: 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61  d ("tripped" - a
9ad0: 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61  s in "tripping a
9ae0: 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61   circuit.** brea
9af0: 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74  ker") and made t
9b00: 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64  o return tripCod
9b10: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
9b20: 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74  ny further.** at
9b30: 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68  tempts to use th
9b40: 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64  at cursor.  Read
9b50: 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20   cursors remain 
9b60: 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a  open and valid.*
9b70: 2a 20 62 75 74 20 61 72 65 20 22 73 61 76 65 64  * but are "saved
9b80: 22 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 61  " in case the ta
9b90: 62 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f  ble pages are mo
9ba0: 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76  ved around..*/.v
9bb0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
9bc0: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
9bd0: 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  db, int tripCode
9be0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
9bf0: 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  t inTrans = 0;. 
9c00: 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67   int schemaChang
9c10: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
9c20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9c30: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
9c40: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
9c50: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f  gnMalloc();..  /
9c60: 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74  * Obtain all b-t
9c70: 72 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f  ree mutexes befo
9c80: 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61  re making any ca
9c90: 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c  lls to BtreeRoll
9ca0: 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68  back(). .  ** Th
9cb0: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
9cc0: 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e  in case the tran
9cd0: 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f  saction being ro
9ce0: 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20  lled back has.  
9cf0: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ** modified the 
9d00: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
9d10: 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d   If the b-tree m
9d20: 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74  utexes are not t
9d30: 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20  aken.  ** here, 
9d40: 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61  then another sha
9d50: 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63  red-cache connec
9d60: 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b  tion might sneak
9d70: 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a   in between.  **
9d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f   the database ro
9d90: 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d  llback and schem
9da0: 61 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63  a reset, which c
9db0: 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20  an cause false. 
9dc0: 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72   ** corruption r
9dd0: 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63  eports in some c
9de0: 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69  ases.  */.  sqli
9df0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
9e00: 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68  (db);.  schemaCh
9e10: 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ange = (db->flag
9e20: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
9e30: 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20  nChanges)!=0 && 
9e40: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
9e50: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
9e60: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
9e70: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
9e80: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
9e90: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
9ea0: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
9eb0: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
9ec0: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
9ed0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9ee0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
9ef0: 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70  Rollback(p, trip
9f00: 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61  Code, !schemaCha
9f10: 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nge);.    }.  }.
9f20: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
9f30: 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c  lback(db);.  sql
9f40: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
9f50: 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64  loc();..  if( (d
9f60: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
9f70: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d  InternChanges)!=
9f80: 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 && db->init.bu
9f90: 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  sy==0 ){.    sql
9fa0: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
9fb0: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
9fc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
9fd0: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
9fe0: 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20  nnection(db);.  
9ff0: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
a000: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
a010: 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64   /* Any deferred
a020: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
a030: 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20  ations have now 
a040: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a  been resolved. *
a050: 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  /.  db->nDeferre
a060: 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d  dCons = 0;.  db-
a070: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
a080: 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  s = 0;.  db->fla
a090: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
a0a0: 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66  ferFKs;..  /* If
a0b0: 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f   one has been co
a0c0: 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65  nfigured, invoke
a0d0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f   the rollback-ho
a0e0: 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ok callback */. 
a0f0: 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61   if( db->xRollba
a100: 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69  ckCallback && (i
a110: 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61  nTrans || !db->a
a120: 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20  utoCommit) ){.  
a130: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
a140: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c  allback(db->pRol
a150: 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d  lbackArg);.  }.}
a160: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
a170: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63   static string c
a180: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
a190: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
a1a0: 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f   to the error co
a1b0: 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  de.** specified 
a1c0: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  in the argument.
a1d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
a1e0: 53 51 4c 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f  SQLITE_NEED_ERR_
a1f0: 4e 41 4d 45 29 0a 63 6f 6e 73 74 20 63 68 61 72  NAME).const char
a200: 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65   *sqlite3ErrName
a210: 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73  (int rc){.  cons
a220: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
a230: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67  0;.  int i, orig
a240: 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69  Rc = rc;.  for(i
a250: 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65  =0; i<2 && zName
a260: 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20  ==0; i++, rc &= 
a270: 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63  0xff){.    switc
a280: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63  h( rc ){.      c
a290: 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20  ase SQLITE_OK:  
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
a2b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f  Name = "SQLITE_O
a2c0: 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  K";             
a2d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a2e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
a2f0: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
a300: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a310: 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20  ERROR";         
a320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a330: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
a340: 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20  ERNAL:          
a350: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a360: 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20  _INTERNAL";     
a370: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a380: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
a390: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
a3a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a3b0: 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20  E_PERM";        
a3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a3d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
a3e0: 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20  BORT:           
a3f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a400: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
a410: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a420: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a430: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20  ABORT_ROLLBACK: 
a440: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a450: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
a460: 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  CK";    break;. 
a470: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a480: 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20  _BUSY:          
a490: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a4a0: 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20  LITE_BUSY";     
a4b0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a4c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a4d0: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a  E_BUSY_RECOVERY:
a4e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a4f0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
a500: 45 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ERY";     break;
a510: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a520: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
a530: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
a540: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
a550: 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  SHOT";     break
a560: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a570: 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
a580: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a590: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b  "SQLITE_LOCKED";
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a5b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a5c0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
a5d0: 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d  EDCACHE: zName =
a5e0: 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f   "SQLITE_LOCKED_
a5f0: 53 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65  SHAREDCACHE";bre
a600: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a610: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
a620: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a630: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  = "SQLITE_NOMEM"
a640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
a650: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a660: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a  SQLITE_READONLY:
a670: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a680: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
a690: 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62  NLY";          b
a6a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a6b0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
a6c0: 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d  _RECOVERY:  zNam
a6d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
a6e0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
a6f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a700: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
a710: 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61  Y_CANTLOCK:  zNa
a720: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
a730: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b  DONLY_CANTLOCK";
a740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a750: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
a760: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e  LY_ROLLBACK:  zN
a770: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
a780: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22  ADONLY_ROLLBACK"
a790: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
a7a0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
a7b0: 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a  NLY_DBMOVED:   z
a7c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
a7d0: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22  EADONLY_DBMOVED"
a7e0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
a7f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
a800: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
a810: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a820: 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20  INTERRUPT";     
a830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a840: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a850: 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR:             
a860: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a870: 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20  _IOERR";        
a880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a890: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a8a0: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
a8b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a8c0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20  E_IOERR_READ";  
a8d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a8e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a8f0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a  OERR_SHORT_READ:
a900: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a910: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
a920: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
a930: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a940: 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20  IOERR_WRITE:    
a950: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a960: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22  ITE_IOERR_WRITE"
a970: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
a980: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a990: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20  _IOERR_FSYNC:   
a9a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a9b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
a9c0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
a9d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a9e0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
a9f0: 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  C:    zName = "S
aa00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
aa10: 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b  FSYNC";   break;
aa20: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aa30: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
aa40: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
aa50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
aa60: 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b  NCATE";    break
aa70: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aa80: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a  ITE_IOERR_FSTAT:
aa90: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aaa0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
aab0: 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61  TAT";       brea
aac0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aad0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
aae0: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
aaf0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55   "SQLITE_IOERR_U
ab00: 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  NLOCK";      bre
ab10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ab20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
ab30: 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  CK:       zName 
ab40: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ab50: 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72  RDLOCK";      br
ab60: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ab70: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
ab80: 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ETE:       zName
ab90: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
aba0: 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62  _DELETE";      b
abb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
abc0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
abd0: 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  MEM:        zNam
abe0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
abf0: 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  R_NOMEM";       
ac00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ac10: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
ac20: 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61  CCESS:       zNa
ac30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ac40: 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20  RR_ACCESS";     
ac50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ac60: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ac70: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
ac80: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
acb0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
acc0: 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65  SERVEDLOCK"; bre
acd0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ace0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
acf0: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
ad00: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ad10: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72  LOCK";        br
ad20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
ad40: 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  SE:        zName
ad50: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ad60: 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62  _CLOSE";       b
ad70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ad80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
ad90: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d  R_CLOSE:    zNam
ada0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
adb0: 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20  R_DIR_CLOSE";   
adc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
add0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
ade0: 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61  HMOPEN:      zNa
adf0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ae00: 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20  RR_SHMOPEN";    
ae10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ae20: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ae30: 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e  SHMSIZE:      zN
ae40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ae50: 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20  ERR_SHMSIZE";   
ae60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ae70: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ae80: 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a  _SHMLOCK:      z
ae90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
aea0: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20  OERR_SHMLOCK";  
aeb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
aed0: 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20  R_SHMMAP:       
aee0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aef0: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20  IOERR_SHMMAP";  
af00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
af10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
af20: 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20  RR_SEEK:        
af30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
af40: 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20  _IOERR_SEEK";   
af50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
af70: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
af80: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
af90: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
afa0: 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20  OENT";break;.   
afb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
afc0: 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20  OERR_MMAP:      
afd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
afe0: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20  TE_IOERR_MMAP"; 
aff0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b000: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b010: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
b020: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
b030: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
b040: 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  PPATH"; break;. 
b050: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b060: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a  _IOERR_CONVPATH:
b070: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b080: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
b090: 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATH";    break;.
b0a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b0b0: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20  E_CORRUPT:      
b0c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b0d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
b0e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b0f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b100: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a  TE_CORRUPT_VTAB:
b110: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b120: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
b130: 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  TAB";      break
b140: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b150: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20  ITE_NOTFOUND:   
b160: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b170: 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  "SQLITE_NOTFOUND
b180: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
b190: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b1a0: 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
b1b0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b1c0: 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20   "SQLITE_FULL"; 
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b1e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b1f0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
b200: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b210: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
b220: 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  EN";          br
b230: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b240: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b250: 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65  NOTEMPDIR: zName
b260: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
b270: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62  PEN_NOTEMPDIR";b
b280: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b290: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
b2a0: 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d  _ISDIR:     zNam
b2b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
b2c0: 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20  OPEN_ISDIR";    
b2d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b2e0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
b2f0: 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61  N_FULLPATH:  zNa
b300: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
b310: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b  TOPEN_FULLPATH";
b320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b330: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
b340: 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e  EN_CONVPATH:  zN
b350: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
b360: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22  NTOPEN_CONVPATH"
b370: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
b380: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ase SQLITE_PROTO
b390: 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  COL:           z
b3a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
b3b0: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20  ROTOCOL";       
b3c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b3d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
b3e0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
b3f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b400: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20  EMPTY";         
b410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b420: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48   case SQLITE_SCH
b430: 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20  EMA:            
b440: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b450: 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20  _SCHEMA";       
b460: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b470: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
b480: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
b490: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b4a0: 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20  E_TOOBIG";      
b4b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b4c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b4d0: 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20  ONSTRAINT:      
b4e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b4f0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
b500: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b510: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b520: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
b530: 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  E:  zName = "SQL
b540: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
b550: 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20  NIQUE"; break;. 
b560: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b570: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
b580: 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  GER: zName = "SQ
b590: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b5a0: 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a  TRIGGER";break;.
b5b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b5c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
b5d0: 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20  EIGNKEY:.       
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b600: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b610: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b  INT_FOREIGNKEY";
b620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b630: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b640: 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20  TRAINT_CHECK:   
b650: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b660: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
b670: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
b680: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b690: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
b6a0: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b6d0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
b6e0: 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72  RIMARYKEY";   br
b6f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b700: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b710: 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65  T_NOTNULL: zName
b720: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b730: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62  RAINT_NOTNULL";b
b740: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b750: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b760: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20  NT_COMMITHOOK:. 
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b790: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b7a0: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
b7b0: 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a  HOOK";   break;.
b7c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b7d0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
b7e0: 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  B:    zName = "S
b7f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b800: 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b  _VTAB";   break;
b810: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b820: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
b830: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20  NCTION:.        
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b860: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b870: 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20  NT_FUNCTION";   
b880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b890: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b8a0: 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a  RAINT_ROWID:   z
b8b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b8c0: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22  ONSTRAINT_ROWID"
b8d0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
b8e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
b8f0: 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20  ATCH:           
b900: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b910: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20  MISMATCH";      
b920: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b930: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
b940: 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  USE:            
b950: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b960: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20  _MISUSE";       
b970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b980: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
b990: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
b9a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b9b0: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
b9c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b9d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
b9e0: 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  UTH:            
b9f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ba00: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
ba10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ba20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ba30: 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20  FORMAT:         
ba40: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ba50: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
ba60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ba70: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ba80: 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20  _RANGE:         
ba90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
baa0: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
bab0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bac0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bad0: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
bae0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
baf0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
bb00: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bb10: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bb20: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20  TE_ROW:         
bb30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bb40: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
bb50: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bb60: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bb70: 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20  ITE_NOTICE:     
bb80: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bb90: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b  "SQLITE_NOTICE";
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bbb0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bbc0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
bbd0: 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d  VER_WAL: zName =
bbe0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
bbf0: 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65  RECOVER_WAL";bre
bc00: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bc10: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
bc20: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20  OVER_ROLLBACK:. 
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bc50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
bc60: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
bc70: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
bc80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bc90: 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20  E_WARNING:      
bca0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bcb0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20  QLITE_WARNING"; 
bcc0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bcd0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bce0: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
bcf0: 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  NDEX:  zName = "
bd00: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
bd10: 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  UTOINDEX"; break
bd20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bd30: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
bd40: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bd50: 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20  "SQLITE_DONE";  
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bd70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
bd80: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
bd90: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
bda0: 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
bdb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
bdc0: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
bdd0: 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57  , "SQLITE_UNKNOW
bde0: 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b  N(%d)", origRc);
bdf0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75  .    zName = zBu
be00: 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  f;.  }.  return 
be10: 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
be20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
be30: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
be40: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
be50: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
be60: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
be70: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
be80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
be90: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
bea0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
beb0: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
bec0: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
bed0: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
bee0: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
bef0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
bf00: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
bf10: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
bf20: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
bf30: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
bf40: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
bf50: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
bf60: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
bf70: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
bf80: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
bf90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bfa0: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
bfb0: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
bfc0: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
bfd0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
bfe0: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
bff0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
c000: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c010: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
c020: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
c030: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
c040: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
c050: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
c060: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
c070: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
c080: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
c090: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
c0a0: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
c0b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
c0c0: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
c0d0: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
c0e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
c0f0: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
c100: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
c110: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
c120: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
c130: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
c140: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
c150: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
c160: 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f  UND    */ "unkno
c170: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20  wn operation",. 
c180: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
c190: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
c1a0: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
c1b0: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
c1c0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
c1d0: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
c1e0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
c1f0: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
c200: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
c210: 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  / "locking proto
c220: 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  col",.    /* SQL
c230: 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20  ITE_EMPTY       
c240: 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69  */ "table contai
c250: 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20  ns no data",.   
c260: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
c270: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
c280: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
c290: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
c2a0: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
c2b0: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
c2c0: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
c2d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
c2e0: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
c2f0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
c300: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c310: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
c320: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
c330: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
c340: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
c350: 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e   "library routin
c360: 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20  e called out of 
c370: 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f  sequence",.    /
c380: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
c390: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
c3a0: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
c3b0: 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a  isabled",.    /*
c3c0: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
c3d0: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
c3e0: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
c3f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
c400: 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78  MAT      */ "aux
c410: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
c420: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20  format error",. 
c430: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
c440: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e  GE       */ "bin
c450: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
c460: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
c470: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
c480: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
c490: 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
c4a0: 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
c4b0: 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  abase",.  };.  c
c4c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
c4d0: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
c4e0: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
c4f0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
c500: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
c510: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
c520: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
c530: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
c540: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c550: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
c560: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
c570: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
c580: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
c590: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
c5a0: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
c5b0: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
c5c0: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
c5d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c5e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c5f0: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
c600: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
c610: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
c620: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
c630: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
c640: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
c650: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
c660: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
c670: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
c680: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
c690: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
c6a0: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
c6b0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
c6c0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
c6d0: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
c6e0: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
c6f0: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
c700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
c710: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c720: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c740: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
c750: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
c760: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
c770: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
c780: 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 73 74  HAVE_USLEEP.  st
c790: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65  atic const u8 de
c7a0: 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  lays[] =.     { 
c7b0: 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c  1, 2, 5, 10, 15,
c7c0: 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35   20, 25, 25,  25
c7d0: 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20  ,  50,  50, 100 
c7e0: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
c7f0: 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a  t u8 totals[] =.
c800: 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20       { 0, 1, 3, 
c810: 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20   8, 18, 33, 53, 
c820: 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37  78, 103, 128, 17
c830: 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69  8, 228 };.# defi
c840: 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53  ne NDELAY ArrayS
c850: 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71  ize(delays).  sq
c860: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
c870: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
c880: 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e  t timeout = db->
c890: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
c8a0: 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b  nt delay, prior;
c8b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ..  assert( coun
c8c0: 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f  t>=0 );.  if( co
c8d0: 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a  unt < NDELAY ){.
c8e0: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
c8f0: 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70  ys[count];.    p
c900: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f  rior = totals[co
c910: 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unt];.  }else{. 
c920: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
c930: 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20  s[NDELAY-1];.   
c940: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
c950: 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61  NDELAY-1] + dela
c960: 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59  y*(count-(NDELAY
c970: 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  -1));.  }.  if( 
c980: 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20  prior + delay > 
c990: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64  timeout ){.    d
c9a0: 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d  elay = timeout -
c9b0: 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20   prior;.    if( 
c9c0: 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72  delay<=0 ) retur
c9d0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
c9e0: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
c9f0: 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b  fs, delay*1000);
ca00: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c  .  return 1;.#el
ca10: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  se.  sqlite3 *db
ca20: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
ca30: 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  r;.  int timeout
ca40: 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70   = ((sqlite3 *)p
ca50: 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74  tr)->busyTimeout
ca60: 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31  ;.  if( (count+1
ca70: 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74  )*1000 > timeout
ca80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ca90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
caa0: 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c  sSleep(db->pVfs,
cab0: 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74   1000000);.  ret
cac0: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
cad0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
cae0: 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e  e given busy han
caf0: 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dler..**.** This
cb00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
cb10: 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61  ed when an opera
cb20: 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68  tion failed with
cb30: 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74   a lock..** If t
cb40: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
cb50: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
cb60: 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65  e lock is retrie
cb70: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74  d.  If it.** ret
cb80: 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72  urns 0, the oper
cb90: 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74  ation aborts wit
cba0: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
cbb0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
cbc0: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
cbd0: 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64  Handler(BusyHand
cbe0: 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ler *p){.  int r
cbf0: 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  c;.  if( NEVER(p
cc00: 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63  ==0) || p->xFunc
cc10: 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c  ==0 || p->nBusy<
cc20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
cc30: 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d  rc = p->xFunc(p-
cc40: 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29  >pArg, p->nBusy)
cc50: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
cc60: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20  .    p->nBusy = 
cc70: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
cc80: 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d   p->nBusy++;.  }
cc90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d  .  return rc; .}
cca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ccb0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75  tine sets the bu
ccc0: 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  sy callback for 
ccd0: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
cce0: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
ccf0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
cd00: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
cd10: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ven argument..*/
cd20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
cd30: 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  y_handler(.  sql
cd40: 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
cd50: 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69  (*xBusy)(void*,i
cd60: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
cd70: 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  g.){.#ifdef SQLI
cd80: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
cd90: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
cda0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
cdb0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
cdc0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
cdd0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
cde0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
cdf0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
ce00: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
ce10: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
ce20: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
ce30: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
ce40: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
ce50: 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73  y = 0;.  db->bus
ce60: 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20  yTimeout = 0;.  
ce70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ce80: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
ce90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cea0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
ceb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
cec0: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
ced0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cee0: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
cef0: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
cf00: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
cf10: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
cf20: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
cf30: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
cf40: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
cf50: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
cf60: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
cf70: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
cf80: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
cf90: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
cfa0: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
cfb0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
cfc0: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
cfd0: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
cfe0: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
cff0: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
d000: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
d010: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
d020: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
d030: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
d040: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d050: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
d060: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
d070: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d080: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
d090: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
d0a0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
d0b0: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
d0c0: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
d0d0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70   = (unsigned)nOp
d0e0: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
d0f0: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
d100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
d110: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
d120: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
d130: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
d140: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
d150: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
d160: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d170: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
d180: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
d190: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
d1a0: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
d1b0: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
d1c0: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
d1d0: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
d1e0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
d1f0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
d200: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
d210: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
d220: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
d230: 6d 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ms){.#ifdef SQLI
d240: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
d250: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
d260: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
d270: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
d280: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
d290: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73  .#endif.  if( ms
d2a0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
d2b0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
d2c0: 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  b, sqliteDefault
d2d0: 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76  BusyCallback, (v
d2e0: 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62  oid*)db);.    db
d2f0: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
d300: 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ms;.  }else{.   
d310: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
d320: 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b  ndler(db, 0, 0);
d330: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
d340: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d350: 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64  * Cause any pend
d360: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  ing operation to
d370: 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72   stop at its ear
d380: 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74  liest opportunit
d390: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
d3a0: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c  e3_interrupt(sql
d3b0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
d3c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d3d0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
d3e0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
d3f0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
d400: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
d410: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
d420: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
d430: 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  f.  db->u1.isInt
d440: 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a  errupted = 1;.}.
d450: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
d460: 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ction is exactly
d470: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
d480: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
d490: 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a  tion(), except.*
d4a0: 2a 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73  * that it is des
d4b0: 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  igned to be call
d4c0: 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63  ed by internal c
d4d0: 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65  ode. The differe
d4e0: 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69  nce is.** that i
d4f0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
d500: 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72  ls in sqlite3_cr
d510: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
d520: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a   an error code.*
d530: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
d540: 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c  d the mallocFail
d550: 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e  ed flag cleared.
d560: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
d570: 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71  CreateFunc(.  sq
d580: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
d590: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69  st char *zFuncti
d5a0: 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  onName,.  int nA
d5b0: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
d5c0: 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61   void *pUserData
d5d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
d5e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
d5f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
d600: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
d610: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
d620: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
d630: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
d640: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
d650: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
d660: 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74  xt*),.  FuncDest
d670: 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63  ructor *pDestruc
d680: 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66  tor.){.  FuncDef
d690: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65   *p;.  int nName
d6a0: 3b 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61  ;.  int extraFla
d6b0: 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  gs;..  assert( s
d6c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d6d0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
d6e0: 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e    if( zFunctionN
d6f0: 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20  ame==0 ||.      
d700: 28 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  (xFunc && (xFina
d710: 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20  l || xStep)) || 
d720: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
d730: 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53  & (xFinal && !xS
d740: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
d750: 21 78 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e  !xFunc && (!xFin
d760: 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c  al && xStep)) ||
d770: 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20  .      (nArg<-1 
d780: 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d  || nArg>SQLITE_M
d790: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29  AX_FUNCTION_ARG)
d7a0: 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28   ||.      (255<(
d7b0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
d7c0: 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69  trlen30( zFuncti
d7d0: 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20  onName))) ){.   
d7e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d7f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
d800: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
d810: 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d  E_FUNC_CONSTANT=
d820: 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e  =SQLITE_DETERMIN
d830: 49 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61  ISTIC );.  extra
d840: 46 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53  Flags = enc &  S
d850: 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
d860: 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53  TIC;.  enc &= (S
d870: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
d880: 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a  SK|SQLITE_ANY);.
d890: 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54    .#ifndef SQLIT
d8a0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f  E_OMIT_UTF16.  /
d8b0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
d8c0: 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
d8d0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
d8e0: 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
d8f0: 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
d900: 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
d910: 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
d920: 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
d930: 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
d940: 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
d950: 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
d960: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
d970: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53  ..  **.  ** If S
d980: 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65  QLITE_ANY is spe
d990: 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65  cified, add thre
d9a0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  e versions of th
d9b0: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  e function.  ** 
d9c0: 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
d9d0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e  e..  */.  if( en
d9e0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  c==SQLITE_UTF16 
d9f0: 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c  ){.    enc = SQL
da00: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
da10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63  .  }else if( enc
da20: 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a  ==SQLITE_ANY ){.
da30: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
da40: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
da50: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
da60: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
da70: 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72  SQLITE_UTF8|extr
da80: 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  aFlags,.        
da90: 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e   pUserData, xFun
daa0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
dab0: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
dac0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dad0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
dae0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
daf0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
db00: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
db10: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78  QLITE_UTF16LE|ex
db20: 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  traFlags,.      
db30: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
db40: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
db50: 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72  nal, pDestructor
db60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
db70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
db80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
db90: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63  c;.    }.    enc
dba0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   = SQLITE_UTF16B
dbb0: 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65  E;.  }.#else.  e
dbc0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
dbd0: 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a  ;.#endif.  .  /*
dbe0: 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69   Check if an exi
dbf0: 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69  sting function i
dc00: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
dc10: 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  en or deleted. I
dc20: 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74  f so,.  ** and t
dc30: 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
dc40: 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  VMs, then return
dc50: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66   SQLITE_BUSY. If
dc60: 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a   a function.  **
dc70: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
dc80: 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74  dden/deleted but
dc90: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63   there are no ac
dca0: 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20  tive VMs, allow 
dcb0: 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  the.  ** operati
dcc0: 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62  on to continue b
dcd0: 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  ut invalidate al
dce0: 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74  l precompiled st
dcf0: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
dd00: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
dd10: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
dd20: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d  nctionName, nNam
dd30: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
dd40: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
dd50: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
dd60: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43   SQLITE_FUNC_ENC
dd70: 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d  MASK)==enc && p-
dd80: 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20  >nArg==nArg ){. 
dd90: 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
dda0: 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
ddb0: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
ddc0: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
ddd0: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
dde0: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
ddf0: 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63  modify user-func
de00: 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69  tion due to acti
de10: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
de20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
de30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
de40: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
de50: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
de60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
de70: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
de80: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
de90: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
dea0: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
deb0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
dec0: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d  nctionName, nNam
ded0: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
dee0: 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , 1);.  assert(p
def0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
df00: 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20  iled);.  if( !p 
df10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
df20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
df30: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65  .  /* If an olde
df40: 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  r version of the
df50: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61   function with a
df60: 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74   configured dest
df70: 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62  ructor is.  ** b
df80: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e  eing replaced in
df90: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
dfa0: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  tor function her
dfb0: 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e  e. */.  function
dfc0: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
dfd0: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
dfe0: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
dff0: 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  uctor->nRef++;. 
e000: 20 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63   }.  p->pDestruc
e010: 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f  tor = pDestructo
e020: 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67  r;.  p->funcFlag
e030: 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67  s = (p->funcFlag
e040: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
e050: 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61  ENCMASK) | extra
e060: 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73  Flags;.  testcas
e070: 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  e( p->funcFlags 
e080: 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  & SQLITE_DETERMI
e090: 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78  NISTIC );.  p->x
e0a0: 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20  Func = xFunc;.  
e0b0: 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70  p->xStep = xStep
e0c0: 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65  ;.  p->xFinalize
e0d0: 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e   = xFinal;.  p->
e0e0: 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65  pUserData = pUse
e0f0: 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67  rData;.  p->nArg
e100: 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20   = (u16)nArg;.  
e110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
e130: 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74  e new user funct
e140: 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
e150: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e160: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
e170: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
e180: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
e190: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
e1a0: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
e1b0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
e1c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e1d0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e1e0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
e1f0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
e200: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e210: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e220: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
e230: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
e240: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
e250: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
e260: 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c  on_v2(db, zFunc,
e270: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
e280: 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20  Func, xStep,.   
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a   xFinal, 0);.}..
e2c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
e2d0: 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a  te_function_v2(.
e2e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
e2f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
e300: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
e310: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
e320: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
e330: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
e340: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e350: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e360: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e370: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e380: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e390: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e3a0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e3b0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
e3c0: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
e3d0: 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d *).){.  int rc
e3e0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e3f0: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
e400: 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69  r *pArg = 0;..#i
e410: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e420: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e430: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
e440: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
e450: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e460: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e470: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
e480: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e490: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
e4a0: 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( xDestroy ){.  
e4b0: 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65    pArg = (FuncDe
e4c0: 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74  structor *)sqlit
e4d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
e4e0: 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  b, sizeof(FuncDe
e4f0: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
e500: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
e510: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
e520: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
e530: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
e540: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
e550: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
e560: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
e570: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
e580: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
e590: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
e5a0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
e5b0: 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b  , xFinal, pArg);
e5c0: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
e5d0: 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  Arg->nRef==0 ){.
e5e0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
e5f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
e600: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
e610: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e620: 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a  db, pArg);.  }..
e630: 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c   out:.  rc = sql
e640: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
e650: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
e660: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e670: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e680: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
e690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
e6a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
e6b0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a  ate_function16(.
e6c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
e6d0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75   const void *zFu
e6e0: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
e6f0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54  t nArg,.  int eT
e700: 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a  extRep,.  void *
e710: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
e720: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
e730: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e740: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
e750: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
e760: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e770: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
e780: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
e790: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e7a0: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
e7b0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b  .  char *zFunc8;
e7c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e7d0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e7e0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
e7f0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
e800: 20 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d   || zFunctionNam
e810: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
e820: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e830: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
e840: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
e850: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
e860: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
e870: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e  Failed );.  zFun
e880: 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  c8 = sqlite3Utf1
e890: 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69  6to8(db, zFuncti
e8a0: 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49  onName, -1, SQLI
e8b0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
e8c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
e8d0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
e8e0: 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78  unc8, nArg, eTex
e8f0: 74 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20  tRep, p, xFunc, 
e900: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29  xStep, xFinal,0)
e910: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
e920: 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20  e(db, zFunc8);. 
e930: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
e940: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
e950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e960: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
e970: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
e980: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
e990: 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e  clare that a fun
e9a0: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f  ction has been o
e9b0: 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76  verloaded by a v
e9c0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
e9d0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74  .** If the funct
e9e0: 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73  ion already exis
e9f0: 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20  ts as a regular 
ea00: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c  global function,
ea10: 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
ea20: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
ea30: 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  .  If the functi
ea40: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
ea50: 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a  t, then create.*
ea60: 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74  * a new one that
ea70: 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61   always throws a
ea80: 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e   run-time error.
ea90: 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69    .**.** When vi
eaa0: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74  rtual tables int
eab0: 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61  end to provide a
eac0: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e  n overloaded fun
ead0: 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73  ction, they.** s
eae0: 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20  hould call this 
eaf0: 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20  routine to make 
eb00: 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  sure the global 
eb10: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e  function exists.
eb20: 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e  .** A global fun
eb30: 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74  ction must exist
eb40: 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61   in order for na
eb50: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f  me resolution to
eb60: 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c   work.** properl
eb70: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
eb80: 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
eb90: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
eba0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
ebb0: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e   *zName,.  int n
ebc0: 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61  Arg.){.  int nNa
ebd0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
ebe0: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  en30(zName);.  i
ebf0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ec00: 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  K;..#ifdef SQLIT
ec10: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
ec20: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
ec30: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
ec40: 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c  b) || zName==0 |
ec50: 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20  | nArg<-2 ){.   
ec60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
ec70: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
ec80: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
ec90: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
eca0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  >mutex);.  if( s
ecb0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
ecc0: 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  on(db, zName, nN
ecd0: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
ece0: 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b  E_UTF8, 0)==0 ){
ecf0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ed00: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ed10: 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
ed20: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49       0, sqlite3I
ed50: 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20  nvalidFunction, 
ed60: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
ed70: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
ed80: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
ed90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
eda0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
edb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
edc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
edd0: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52  IT_TRACE./*.** R
ede0: 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
edf0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
ee00: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
ee10: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
ee20: 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72  ed trace.** is r
ee30: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
ee40: 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75   A NULL trace fu
ee50: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
ee60: 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20  t no tracing is 
ee70: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
ee80: 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69  -NULL.** trace i
ee90: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
eea0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
eeb0: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
eec0: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a   start of each.*
eed0: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  * SQL statement.
eee0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
eef0: 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20  3_trace(sqlite3 
ef00: 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61  *db, void (*xTra
ef10: 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  ce)(void*,const 
ef20: 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  char*), void *pA
ef30: 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  rg){.  void *pOl
ef40: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
ef50: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
ef60: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
ef70: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
ef80: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
ef90: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
efa0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
efb0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
efc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
efd0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
efe0: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61   pOld = db->pTra
eff0: 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72  ceArg;.  db->xTr
f000: 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20  ace = xTrace;.  
f010: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20  db->pTraceArg = 
f020: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
f030: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f040: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f050: 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52   pOld;.}./*.** R
f060: 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c  egister a profil
f070: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
f080: 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
f090: 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
f0a0: 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65  ered .** profile
f0b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74   function is ret
f0c0: 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
f0d0: 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75   NULL profile fu
f0e0: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
f0f0: 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69  t no profiling i
f100: 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
f110: 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69  on-NULL.** profi
f120: 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  le is a pointer 
f130: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
f140: 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
f150: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
f160: 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73  of.** each SQL s
f170: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
f180: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73   run..*/.void *s
f190: 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a  qlite3_profile(.
f1a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f1b0: 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65   void (*xProfile
f1c0: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
f1d0: 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36  ar*,sqlite_uint6
f1e0: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
f1f0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
f200: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f210: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f220: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f230: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f240: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
f250: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f260: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
f270: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
f280: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f290: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f2a0: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66  pOld = db->pProf
f2b0: 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ileArg;.  db->xP
f2c0: 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c  rofile = xProfil
f2d0: 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c  e;.  db->pProfil
f2e0: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
f2f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f300: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f310: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
f320: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f330: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a  _OMIT_TRACE */..
f340: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
f350: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
f360: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
f370: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
f380: 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
f390: 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
f3a0: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
f3b0: 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
f3c0: 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
f3d0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
f3e0: 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
f3f0: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
f400: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
f410: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
f420: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
f430: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
f440: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
f450: 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
f460: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
f470: 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
f480: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
f490: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
f4a0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
f4b0: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
f4c0: 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
f4d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f4e0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f4f0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f500: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f510: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
f520: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
f530: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
f540: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f550: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f560: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
f570: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20  ->pCommitArg;.  
f580: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
f590: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
f5a0: 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  .  db->pCommitAr
f5b0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
f5c0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f5d0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f5e0: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a  turn pOld;.}../*
f5f0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
f600: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
f610: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
f620: 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
f630: 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
f640: 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
f650: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
f660: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
f670: 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65   *sqlite3_update
f680: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
f690: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f6a0: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
f6b0: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
f6c0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
f6d0: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
f6e0: 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  id*,int,char con
f6f0: 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20  st *,char const 
f700: 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c  *,sqlite_int64),
f710: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f730: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
f740: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
f750: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69   void *pRet;..#i
f760: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f770: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
f780: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f790: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
f7a0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
f7b0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f7c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f7d0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f7e0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f7f0: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
f800: 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
f810: 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
f820: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
f830: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
f840: 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
f850: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f860: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f870: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
f880: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
f890: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
f8a0: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
f8b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
f8c0: 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
f8d0: 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
f8e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
f8f0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
f900: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
f910: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f930: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
f940: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
f950: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
f960: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
f970: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
f980: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
f990: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
f9a0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
f9b0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
f9c0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
f9d0: 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  et;..#ifdef SQLI
f9e0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f9f0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
fa00: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
fa10: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
fa20: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
fa30: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
fa40: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
fa50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fa60: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
fa70: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f    pRet = db->pRo
fa80: 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d  llbackArg;.  db-
fa90: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
faa0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
fab0: 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41    db->pRollbackA
fac0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
fad0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fae0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
faf0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
fb00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fb10: 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65  IT_WAL./*.** The
fb20: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
fb30: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  k() callback reg
fb40: 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74  istered by sqlit
fb50: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
fb60: 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f  point()..** Invo
fb70: 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  ke sqlite3_wal_c
fb80: 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
fb90: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
fba0: 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
fbb0: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
fbc0: 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61  than sqlite3.pWa
fbd0: 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20  lArg cast to an 
fbe0: 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c  integer (the val
fbf0: 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ue configured by
fc00: 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  .** wal_autochec
fc10: 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69  kpoint())..*/ .i
fc20: 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  nt sqlite3WalDef
fc30: 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64  aultHook(.  void
fc40: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20   *pClientData,  
fc50: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a     /* Argument *
fc60: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
fc70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fc80: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
fc90: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
fca0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
fcb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65   */.  int nFrame
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fcd0: 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29  Size of WAL */.)
fce0: 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d  {.  if( nFrame>=
fcf0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
fd00: 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29  T(pClientData) )
fd10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
fd20: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
fd30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  ;.    sqlite3_wa
fd40: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  l_checkpoint(db,
fd50: 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   zDb);.    sqlit
fd60: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
fd70: 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c();.  }.  retur
fd80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
fd90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fda0: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
fdb0: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20  ** Configure an 
fdc0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
fdd0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  () callback to a
fde0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
fdf0: 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74  ckpoint.** a dat
fe00: 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d  abase after comm
fe10: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
fe20: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
fe30: 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d  e nFrame or.** m
fe40: 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68  ore frames in th
fe50: 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73  e log file. Pass
fe60: 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65  ing zero or a ne
fe70: 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20  gative value as 
fe80: 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61  the.** nFrame pa
fe90: 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73  rameter disables
fea0: 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
feb0: 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e  points entirely.
fec0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  .**.** The callb
fed0: 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
fee0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
fef0: 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69  replaces any exi
ff00: 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a  sting callback.*
ff10: 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69  * registered usi
ff20: 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
ff30: 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c  ook(). Likewise,
ff40: 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63   registering a c
ff50: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  allback.** using
ff60: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
ff70: 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65  k() disables the
ff80: 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
ff90: 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a  point mechanism.
ffa0: 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
ffb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
ffc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
ffd0: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
ffe0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
fff0: 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64  nt nFrame){.#ifd
10000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
10010 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  AL.  UNUSED_PARA
10020 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
10030 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
10040 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66  rame);.#else.#if
10050 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10060 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
10070 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
10080 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
10090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
100a0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
100b0 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29    if( nFrame>0 )
100c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
100d0 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74  l_hook(db, sqlit
100e0 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
100f0 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
10100 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20  PTR(nFrame));.  
10110 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
10120 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
10130 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
10140 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
10150 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
10160 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
10170 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
10180 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
10190 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74  nsaction is writ
101a0 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ten.** into the 
101b0 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20  write-ahead-log 
101c0 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
101d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
101e0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61  void *sqlite3_wa
101f0 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  l_hook(.  sqlite
10200 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
10220 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
10230 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a  this db handle *
10240 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61  /.  int(*xCallba
10250 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69  ck)(void *, sqli
10260 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
10270 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  *, int),.  void 
10280 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
10290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
102a0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
102b0 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  sed to xCallback
102c0 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  () */.){.#ifndef
102d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
102e0 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23  .  void *pRet;.#
102f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10300 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10310 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10320 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
10330 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
10340 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
10350 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10360 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10370 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10380 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
10390 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a   = db->pWalArg;.
103a0 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61    db->xWalCallba
103b0 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
103c0 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20    db->pWalArg = 
103d0 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
103e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
103f0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10400 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72   pRet;.#else.  r
10410 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
10420 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  }../*.** Checkpo
10430 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
10440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10450 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
10460 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
10470 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
10480 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
10490 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
104a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104c0 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65   Name of attache
104d0 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e  d database (or N
104e0 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d  ULL) */.  int eM
104f0 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
10500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
10510 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a  ITE_CHECKPOINT_*
10520 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
10530 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20  *pnLog,         
10540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10550 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20  UT: Size of WAL 
10560 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f  log in frames */
10570 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20  .  int *pnCkpt  
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c     /* OUT: Total
105a0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
105b0 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a  s checkpointed *
105c0 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  /.){.#ifdef SQLI
105d0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65  TE_OMIT_WAL.  re
105e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
105f0 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20  #else.  int rc; 
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10620 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
10630 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  iDb = SQLITE_MAX
10640 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73  _ATTACHED;  /* s
10650 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64  qlite3.aDb[] ind
10660 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63  ex of db to chec
10670 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  kpoint */..#ifde
10680 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10690 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
106a0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
106b0 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
106c0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
106d0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20  _BKPT;.#endif.. 
106e0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
106f0 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
10700 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73  les to -1 in cas
10710 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
10720 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f  s. */.  if( pnLo
10730 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b  g ) *pnLog = -1;
10740 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20  .  if( pnCkpt ) 
10750 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20  *pnCkpt = -1;.. 
10760 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
10770 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
10780 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  VE==0 );.  asser
10790 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
107a0 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a  OINT_FULL==1 );.
107b0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
107c0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
107d0 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65  ART==2 );.  asse
107e0 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
107f0 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d  POINT_TRUNCATE==
10800 33 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  3 );.  if( eMode
10810 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  <SQLITE_CHECKPOI
10820 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d  NT_PASSIVE || eM
10830 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode>SQLITE_CHECK
10840 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29  POINT_TRUNCATE )
10850 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
10860 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32  E-OF: R-03996-12
10870 30 38 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65  088 The M parame
10880 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 76 61  ter must be a va
10890 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20  lid checkpoint. 
108a0 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20     ** mode: */. 
108b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
108c0 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
108d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
108e0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
108f0 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
10900 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
10910 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
10920 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
10930 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
10940 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10950 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
10960 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
10970 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  b, SQLITE_ERROR,
10980 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
10990 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20  se: %s", zDb);. 
109a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
109b0 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
109c0 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
109d0 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
109e0 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65  t(db, iDb, eMode
109f0 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
10a00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
10a10 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a  or(db, rc);.  }.
10a20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
10a30 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
10a40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10a50 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10a60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
10a70 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.}.../*.** C
10a80 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
10a90 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69  se zDb. If zDb i
10aa0 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68  s NULL, or if th
10ab0 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69  e buffer zDb poi
10ac0 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69  nts.** to contai
10ad0 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ns a zero-length
10ae0 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74   string, all att
10af0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
10b00 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69  are .** checkpoi
10b10 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
10b20 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10b30 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
10b40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
10b50 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ){.  /* EVIDENCE
10b60 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35  -OF: R-41613-205
10b70 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  53 The sqlite3_w
10b80 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c  al_checkpoint(D,
10b90 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  X) is equivalent
10ba0 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   to.  ** sqlite3
10bb0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
10bc0 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48  v2(D,X,SQLITE_CH
10bd0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
10be0 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75  ,0,0). */.  retu
10bf0 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
10c00 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
10c10 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  zDb,SQLITE_CHECK
10c20 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
10c30 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
10c40 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
10c50 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b  *.** Run a check
10c60 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73  point on databas
10c70 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61  e iDb. This is a
10c80 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61   no-op if databa
10c90 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74  se iDb is.** not
10ca0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
10cb0 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  in WAL mode..**.
10cc0 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
10cd0 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74  ion is open on t
10ce0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
10cf0 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20  g checkpointed, 
10d00 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
10d10 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
10d20 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68  _LOCKED and a ch
10d30 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  eckpoint is not 
10d40 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a  attempted. If .*
10d50 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
10d60 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  s while running 
10d70 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  the checkpoint, 
10d80 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
10d90 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
10da0 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54  rned (i.e. SQLIT
10db0 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77  E_IOERR). Otherw
10dc0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
10dd0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
10de0 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
10df0 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20  le db should be 
10e00 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c  held by the call
10e10 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a  er. The mutex.**
10e20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10e30 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d   the specific b-
10e40 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
10e50 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e  pointed is taken
10e60 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63   by.** this func
10e70 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63  tion while the c
10e80 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e  heckpoint is run
10e90 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ning..**.** If i
10ea0 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c  Db is passed SQL
10eb0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
10ec0 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63  , then all attac
10ed0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
10ee0 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65  e.** checkpointe
10ef0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  d. If an error i
10f00 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
10f10 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
10f20 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f  ediately -.** no
10f30 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
10f40 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   to checkpoint a
10f50 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74  ny remaining dat
10f60 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61  abases..**.** Pa
10f70 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73  rameter eMode is
10f80 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
10f90 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
10fa0 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41  E, FULL or RESTA
10fb0 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  RT..*/.int sqlit
10fc0 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  e3Checkpoint(sql
10fd0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
10fe0 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e  b, int eMode, in
10ff0 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70  t *pnLog, int *p
11000 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63  nCkpt){.  int rc
11010 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
11020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
11030 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
11040 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11060 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
11070 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65   through attache
11080 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62  d dbs */.  int b
11090 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Busy = 0;       
110a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
110b0 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53  ue if SQLITE_BUS
110c0 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75  Y has been encou
110d0 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73  ntered */..  ass
110e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
110f0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
11100 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
11110 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67  !pnLog || *pnLog
11120 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ==-1 );.  assert
11130 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e  ( !pnCkpt || *pn
11140 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66  Ckpt==-1 );..  f
11150 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
11160 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b && rc==SQLITE_
11170 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  OK; i++){.    if
11180 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d  ( i==iDb || iDb=
11190 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
111a0 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63  CHED ){.      rc
111b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
111c0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44  heckpoint(db->aD
111d0 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c  b[i].pBt, eMode,
111e0 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b   pnLog, pnCkpt);
111f0 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30  .      pnLog = 0
11200 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d  ;.      pnCkpt =
11210 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
11220 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
11230 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d  .        bBusy =
11240 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
11250 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
11260 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
11270 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
11280 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29  ITE_OK && bBusy)
11290 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
112a0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
112b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
112c0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
112d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
112e0 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65   true if main-me
112f0 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mory should be u
11300 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  sed instead of.*
11310 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
11320 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  le for transient
11330 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64   pager files and
11340 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
11350 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  als..** The valu
11360 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e  e returned depen
11370 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
11380 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  of db->temp_stor
11390 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61  e (runtime.** pa
113a0 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65  rameter) and the
113b0 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
113c0 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45  lue of SQLITE_TE
113d0 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a  MP_STORE. The.**
113e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
113f0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
11400 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
11410 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61  een these two va
11420 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73  lues.** and this
11430 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
11440 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  n value..**.**  
11450 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11460 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
11470 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
11480 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
11490 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
114a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
114b0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
114c0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
114d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114e0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
11510 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
11520 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11540 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
11550 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
11560 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
11570 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
11580 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
11590 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
115a0 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
115b0 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
115c0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
115e0 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
115f0 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
11630 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11650 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
11660 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
11670 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20  turn 1).**   2  
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
116a0 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
116b0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
116c0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
116d0 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
116e0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
116f0 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f     (return 1).*/
11700 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70  .int sqlite3Temp
11710 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73  InMemory(const s
11720 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
11730 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11740 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28  RE==1.  return (
11750 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
11760 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =2 );.#endif.#if
11770 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11780 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28  RE==2.  return (
11790 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
117a0 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =1 );.#endif.#if
117b0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
117c0 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50  RE==3.  UNUSED_P
117d0 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
117e0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
117f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
11800 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49  _STORE<1 || SQLI
11810 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a  TE_TEMP_STORE>3.
11820 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11830 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ER(db);.  return
11840 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
11850 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38  .** Return UTF-8
11860 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
11870 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
11880 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
11890 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
118a0 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
118b0 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
118c0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
118d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
118e0 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
118f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
11900 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
11910 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  EM);.  }.  if( !
11920 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
11930 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
11940 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
11950 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
11960 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a  E_MISUSE_BKPT);.
11970 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
11980 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
11990 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
119a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
119b0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
119c0 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
119d0 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EM);.  }else{.  
119e0 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
119f0 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a  pErr==0 );.    z
11a00 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
11a10 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d  3_value_text(db-
11a20 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65  >pErr);.    asse
11a30 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
11a40 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
11a50 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   z==0 ){.      z
11a60 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
11a70 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20  (db->errCode);. 
11a80 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
11a90 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
11aa0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11ab0 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
11ac0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
11ad0 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  F16./*.** Return
11ae0 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
11af0 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
11b00 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
11b10 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
11b20 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
11b30 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
11b40 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65  _errmsg16(sqlite
11b50 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
11b60 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66   const u16 outOf
11b70 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f  Mem[] = {.    'o
11b80 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
11b90 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c  , 'o', 'f', ' ',
11ba0 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20   'm', 'e', 'm', 
11bb0 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30  'o', 'r', 'y', 0
11bc0 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
11bd0 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b  onst u16 misuse[
11be0 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27  ] = {.    'l', '
11bf0 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61  i', 'b', 'r', 'a
11c00 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27  ', 'r', 'y', ' '
11c10 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c  , .    'r', 'o',
11c20 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20   'u', 't', 'i', 
11c30 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a  'n', 'e', ' ', .
11c40 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c      'c', 'a', 'l
11c50 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27  ', 'l', 'e', 'd'
11c60 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
11c70 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
11c80 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27  .    'o', 'f', '
11c90 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65   ', .    's', 'e
11ca0 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27  ', 'q', 'u', 'e'
11cb0 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c  , 'n', 'c', 'e',
11cc0 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
11cd0 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
11ce0 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
11cf0 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
11d00 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
11d10 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
11d20 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
11d30 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
11d40 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
11d50 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11d60 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
11d70 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
11d80 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11d90 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
11da0 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
11db0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
11dc0 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
11dd0 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
11de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
11df0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
11e00 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65  (db, db->errCode
11e10 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
11e20 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20  db->errCode));. 
11e30 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
11e40 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
11e50 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
11e60 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
11e70 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
11e80 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
11e90 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
11ea0 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
11eb0 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
11ec0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
11ed0 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
11ee0 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
11ef0 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
11f00 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
11f10 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
11f20 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
11f30 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
11f40 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
11f50 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
11f60 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
11f70 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
11f80 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
11f90 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
11fa0 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  led = 0;.  }.  s
11fb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
11fc0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
11fd0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
11fe0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11ff0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
12000 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
12010 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
12020 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
12030 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
12040 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
12050 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
12060 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
12070 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
12080 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
12090 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
120a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
120b0 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
120c0 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
120d0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
120e0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
120f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12100 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
12120 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
12130 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
12140 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
12160 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65  >errCode & db->e
12170 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71  rrMask;.}.int sq
12180 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
12190 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
121a0 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
121b0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
121c0 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
121d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
121e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
121f0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
12200 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12210 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
12220 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12230 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
12240 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  ->errCode;.}../*
12250 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
12260 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
12270 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
12280 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
12290 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
122a0 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69  t.  For now, thi
122b0 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74  s simply calls t
122c0 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69  he internal sqli
122d0 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66  te3ErrStr().** f
122e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  unction..*/.cons
122f0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
12300 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a  errstr(int rc){.
12310 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12320 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f  ErrStr(rc);.}../
12330 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
12340 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  w collating func
12350 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73  tion for databas
12360 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d  e "db".  The nam
12370 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e  e is zName.** an
12380 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  d the encoding i
12390 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  s enc..*/.static
123a0 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61   int createColla
123b0 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
123c0 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   db,.  const cha
123d0 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20  r *zName, .  u8 
123e0 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74  enc,.  void* pCt
123f0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
12400 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
12410 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
12420 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
12430 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
12440 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
12450 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32  Coll;.  int enc2
12460 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
12470 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12480 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
12490 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
124a0 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
124b0 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
124c0 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
124d0 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
124e0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
124f0 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
12500 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
12510 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
12520 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
12530 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
12540 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
12550 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63  ally..  */.  enc
12560 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63  2 = enc;.  testc
12570 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
12580 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73  E_UTF16 );.  tes
12590 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
125a0 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
125b0 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  D );.  if( enc2=
125c0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c  =SQLITE_UTF16 ||
125d0 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
125e0 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20  F16_ALIGNED ){. 
125f0 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45     enc2 = SQLITE
12600 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
12610 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c  }.  if( enc2<SQL
12620 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32  ITE_UTF8 || enc2
12630 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  >SQLITE_UTF16BE 
12640 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12650 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12660 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
12670 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
12680 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
12690 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
126a0 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
126b0 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
126c0 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
126d0 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
126e0 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
126f0 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
12700 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
12710 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
12720 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
12730 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
12740 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
12750 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
12760 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  nc2, zName, 0);.
12770 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
12780 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
12790 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
127a0 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
127b0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
127c0 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
127d0 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
127e0 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
127f0 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
12800 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
12810 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
12820 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
12830 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
12840 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12850 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
12860 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
12870 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
12880 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
12890 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
128a0 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
128b0 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
128c0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
128d0 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
128e0 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
128f0 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
12900 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
12910 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
12920 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
12930 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
12940 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
12950 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
12960 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
12970 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
12980 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
12990 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
129a0 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
129b0 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
129c0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
129d0 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
129e0 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
129f0 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
12a00 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
12a10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  zName);.      in
12a20 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
12a30 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
12a40 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
12a50 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
12a60 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
12a70 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
12a80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12a90 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
12aa0 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
12ab0 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
12ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
12ad0 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
12ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12af0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
12b00 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
12b10 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
12b20 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
12b30 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
12b40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12b50 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
12b60 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
12b70 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
12b80 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
12b90 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
12ba0 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
12bb0 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
12bc0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
12bd0 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
12be0 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
12bf0 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OK);.  return SQ
12c00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
12c10 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65  ** This array de
12c20 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72  fines hard upper
12c30 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74   bounds on limit
12c40 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a   values.  The.**
12c50 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73   initializer mus
12c60 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e  t be kept in syn
12c70 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  c with the SQLIT
12c80 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65  E_LIMIT_*.** #de
12c90 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33  fines in sqlite3
12ca0 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  .h..*/.static co
12cb0 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d  nst int aHardLim
12cc0 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54  it[] = {.  SQLIT
12cd0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20  E_MAX_LENGTH,.  
12ce0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
12cf0 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
12d00 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51  MAX_COLUMN,.  SQ
12d10 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
12d20 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
12d30 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
12d40 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  T,.  SQLITE_MAX_
12d50 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54  VDBE_OP,.  SQLIT
12d60 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
12d70 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  RG,.  SQLITE_MAX
12d80 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c  _ATTACHED,.  SQL
12d90 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
12da0 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  TERN_LENGTH,.  S
12db0 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
12dc0 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20  LE_NUMBER,      
12dd0 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d  /* IMP: R-38091-
12de0 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54  32352 */.  SQLIT
12df0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
12e00 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
12e10 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
12e20 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ,.};../*.** Make
12e30 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c   sure the hard l
12e40 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f  imits are set to
12e50 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75   reasonable valu
12e60 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  es.*/.#if SQLITE
12e70 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _MAX_LENGTH<100.
12e80 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
12e90 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  AX_LENGTH must b
12ea0 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
12eb0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
12ec0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c  _MAX_SQL_LENGTH<
12ed0 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
12ee0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
12ef0 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
12f00 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
12f10 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
12f20 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d  _LENGTH>SQLITE_M
12f30 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f  AX_LENGTH.# erro
12f40 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
12f50 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74  _LENGTH must not
12f60 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
12f70 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
12f80 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  TH.#endif.#if SQ
12f90 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
12fa0 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72  D_SELECT<2.# err
12fb0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
12fc0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75  MPOUND_SELECT mu
12fd0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32  st be at least 2
12fe0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
12ff0 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34  TE_MAX_VDBE_OP<4
13000 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
13010 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73  _MAX_VDBE_OP mus
13020 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30  t be at least 40
13030 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13040 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
13050 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ARG<0 || SQLITE_
13060 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
13070 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51  >1000.# error SQ
13080 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
13090 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65  N_ARG must be be
130a0 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30  tween 0 and 1000
130b0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
130c0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c  TE_MAX_ATTACHED<
130d0 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
130e0 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65  ATTACHED>125.# e
130f0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13100 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65  ATTACHED must be
13110 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
13120 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  25.#endif.#if SQ
13130 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
13140 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
13150 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13160 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
13170 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
13180 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
13190 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
131a0 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72  OLUMN>32767.# er
131b0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
131c0 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65  OLUMN must not e
131d0 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64  xceed 32767.#end
131e0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
131f0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c  X_TRIGGER_DEPTH<
13200 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
13210 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
13220 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
13230 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
13240 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
13250 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20  ER_THREADS<0 || 
13260 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
13270 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65  R_THREADS>50.# e
13280 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13290 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d  WORKER_THREADS m
132a0 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
132b0 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a   and 50.#endif..
132c0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
132d0 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
132e0 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
132f0 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
13300 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
13310 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
13320 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
13330 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
13340 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
13350 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
13360 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
13370 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
13380 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
13390 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
133a0 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
133b0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
133c0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
133d0 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
133e0 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
133f0 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
13400 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
13410 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
13420 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
13430 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
13440 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
13450 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65  oldLimit;..#ifde
13460 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13470 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
13480 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
13490 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
134a0 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
134b0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
134c0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
134d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45  ndif..  /* EVIDE
134e0 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d  NCE-OF: R-30189-
134f0 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c  54097 For each l
13500 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53 51  imit category SQ
13510 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a  LITE_LIMIT_NAME.
13520 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
13530 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
13540 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
13550 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65 70  time by a C prep
13560 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61  rocessor.  ** ma
13570 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54  cro called SQLIT
13580 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65  E_MAX_NAME. (The
13590 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68   "_LIMIT_" in th
135a0 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65  e name is change
135b0 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f  d to.  ** "_MAX_
135c0 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ".).  */.  asser
135d0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
135e0 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
135f0 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  H]==SQLITE_MAX_L
13600 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
13610 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13620 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
13630 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
13640 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b  AX_SQL_LENGTH );
13650 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13660 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13670 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49  IT_COLUMN]==SQLI
13680 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b  TE_MAX_COLUMN );
13690 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
136a0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
136b0 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d  IT_EXPR_DEPTH]==
136c0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
136d0 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
136e0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
136f0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
13700 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c  UND_SELECT]==SQL
13710 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
13720 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65  _SELECT);.  asse
13730 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13740 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
13750 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  _OP]==SQLITE_MAX
13760 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73  _VDBE_OP );.  as
13770 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13780 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  [SQLITE_LIMIT_FU
13790 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c  NCTION_ARG]==SQL
137a0 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
137b0 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74  _ARG );.  assert
137c0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
137d0 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
137e0 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ED]==SQLITE_MAX_
137f0 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73  ATTACHED );.  as
13800 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13810 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  [SQLITE_LIMIT_LI
13820 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
13830 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  H]==.           
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c      SQLITE_MAX_L
13870 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
13880 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13890 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
138a0 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
138b0 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45  _NUMBER]==SQLITE
138c0 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
138d0 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28  MBER);.  assert(
138e0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
138f0 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
13900 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
13910 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
13920 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
13930 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13940 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
13950 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d  READS]==SQLITE_M
13960 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
13970 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  S );.  assert( S
13980 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
13990 45 52 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c  ER_THREADS==(SQL
139a0 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29  ITE_N_LIMIT-1) )
139b0 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  ;...  if( limitI
139c0 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
139d0 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
139e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
139f0 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
13a00 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
13a10 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
13a20 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20  Limit>=0 ){     
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a40 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38   IMP: R-52476-28
13a50 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  732 */.    if( n
13a60 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
13a70 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
13a80 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
13a90 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
13aa0 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  Id];  /* IMP: R-
13ab0 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20  51463-25634 */. 
13ac0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
13ad0 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
13ae0 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
13af0 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20  eturn oldLimit; 
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33      /* IMP: R-53
13b20 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a  341-35419 */.}..
13b30 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13b40 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
13b50 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61  arse both URIs a
13b60 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  nd non-URI filen
13b70 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74  ames passed by t
13b80 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50  he.** user to AP
13b90 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69  I functions sqli
13ba0 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  te3_open() or sq
13bb0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c  lite3_open_v2(),
13bc0 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73   and for databas
13bd0 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66  e.** URIs specif
13be0 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41  ied as part of A
13bf0 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73  TTACH statements
13c00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
13c10 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
13c20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
13c30 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
13c40 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a  FS to use (or.**
13c50 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69   a NULL to signi
13c60 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  fy the default V
13c70 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64  FS) if the URI d
13c80 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
13c90 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71  a "vfs=xxx".** q
13ca0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20  uery parameter. 
13cb0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
13cc0 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ent contains the
13cd0 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49   URI (or non-URI
13ce0 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74   filename).** it
13cf0 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20  self. When this 
13d00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13d10 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76  ed the *pFlags v
13d20 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63  ariable should c
13d30 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65  ontain.** the de
13d40 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f  fault flags to o
13d50 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
13d60 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68   handle with. Th
13d70 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
13d80 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79  n.** *pFlags may
13d90 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f   be updated befo
13da0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20  re returning if 
13db0 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  the URI filename
13dc0 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63   contains .** "c
13dd0 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f  ache=xxx" or "mo
13de0 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61  de=xxx" query pa
13df0 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  rameters..**.** 
13e00 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
13e10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
13e20 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
13e30 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74  se *ppVfs is set
13e40 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
13e50 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f  the VFS that sho
13e60 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f  uld be used to o
13e70 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
13e80 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69   file. *pzFile i
13e90 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
13ea0 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
13eb0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
13ec0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
13ed0 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65   open. It is the
13ee0 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
13ef0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
13f00 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
13f10 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
13f20 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a  e() to release.*
13f30 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a  * this buffer..*
13f40 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
13f50 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e   occurs, then an
13f60 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
13f70 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
13f80 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20  nd *pzErrMsg.** 
13f90 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
13fa0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
13fb0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e  containing an En
13fc0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
13fd0 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
13fe0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
13ff0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
14000 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
14010 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a  tually release.*
14020 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79  * this buffer by
14030 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
14040 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _free()..*/.int 
14050 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
14060 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14070 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20  DefaultVfs,     
14080 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
14090 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22   if no "vfs=xxx"
140a0 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f   query option */
140b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
140c0 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uri,            
140d0 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
140e0 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73  ated URI to pars
140f0 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
14100 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
14110 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
14120 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  : SQLITE_OPEN_XX
14130 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
14140 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73  ite3_vfs **ppVfs
14150 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
14160 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20  OUT: VFS to use 
14170 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46  */ .  char **pzF
14180 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
14190 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69        /* OUT: Fi
141a0 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  lename component
141b0 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61   of URI */.  cha
141c0 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141e0 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
141f0 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54  ge (if rc!=SQLIT
14200 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  E_OK) */.){.  in
14210 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14220 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
14230 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73   flags = *pFlags
14240 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
14250 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56  zVfs = zDefaultV
14260 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  fs;.  char *zFil
14270 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69  e;.  char c;.  i
14280 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65  nt nUri = sqlite
14290 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b  3Strlen30(zUri);
142a0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ..  assert( *pzE
142b0 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69  rrMsg==0 );..  i
142c0 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  f( ((flags & SQL
142d0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20  ITE_OPEN_URI)   
142e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
142f0 3a 20 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20  : R-48725-32206 
14300 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  */.            |
14310 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
14320 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20  onfig.bOpenUri) 
14330 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d  /* IMP: R-51689-
14340 34 36 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e  46548 */.   && n
14350 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
14360 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
14370 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  5)==0 /* IMP: R-
14380 35 37 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20  57884-37496 */. 
14390 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
143a0 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61  pt;.    int eSta
143b0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
143c0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
143d0 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69  state when parsi
143e0 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e  ng URI */.    in
143f0 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t iIn;          
14400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14410 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  nput character i
14420 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
14430 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  iOut = 0;       
14440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
14450 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
14460 64 65 78 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e  dex */.    u64 n
14470 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20  Byte = nUri+2;  
14480 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
14490 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
144a0 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f  locate */..    /
144b0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
144c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
144d0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69  flag is set to i
144e0 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56  ndicate to the V
144f0 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a  FS xOpen .    **
14500 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65   method that the
14510 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20  re may be extra 
14520 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f  parameters follo
14530 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61  wing the file-na
14540 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  me.  */.    flag
14550 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
14560 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69  _URI;..    for(i
14570 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20  In=0; iIn<nUri; 
14580 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20  iIn++) nByte += 
14590 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29  (zUri[iIn]=='&')
145a0 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  ;.    zFile = sq
145b0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
145c0 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Byte);.    if( !
145d0 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
145e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
145f0 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65    iIn = 5;.#ifde
14600 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55  f SQLITE_ALLOW_U
14610 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20  RI_AUTHORITY.   
14620 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
14630 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d  i+5, "///", 3)==
14640 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  0 ){.      iIn =
14650 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   7;.      /* The
14660 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69   following condi
14670 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73  tion causes URIs
14680 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69   with five leadi
14690 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a  ng / characters.
146a0 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69        ** like fi
146b0 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74  le://///host/pat
146c0 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65  h to be converte
146d0 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65  d into UNCs like
146e0 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20   //host/path..  
146f0 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65      ** The corre
14700 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20  ct URI for that 
14710 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f  UNC has only two
14720 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67   or four leading
14730 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
14740 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f      ** file://ho
14750 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a  st/path or file:
14760 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20  ////host/path.  
14770 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c  But 5 leading sl
14780 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20  ashes is a .    
14790 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f    ** common erro
147a0 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20  r, we are told, 
147b0 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20  so we handle it 
147c0 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
147d0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
147e0 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20  strncmp(zUri+7, 
147f0 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20  "///", 3)==0 ){ 
14800 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  iIn++; }.    }el
14810 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
14820 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68  Uri+5, "//localh
14830 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b  ost/", 12)==0 ){
14840 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b  .      iIn = 16;
14850 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
14860 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
14870 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f  scheme and autho
14880 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66  rity segments of
14890 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20   the URI. */.   
148a0 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f   if( zUri[5]=='/
148b0 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f  ' && zUri[6]=='/
148c0 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  ' ){.      iIn =
148d0 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   7;.      while(
148e0 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
148f0 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69  ri[iIn]!='/' ) i
14900 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
14910 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d  iIn!=7 && (iIn!=
14920 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f  16 || memcmp("lo
14930 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b  calhost", &zUri[
14940 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20  7], 9)) ){.     
14950 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
14960 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
14970 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68  invalid uri auth
14980 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20  ority: %.*s", . 
14990 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37             iIn-7
149a0 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20  , &zUri[7]);.   
149b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
149c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
149d0 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
149e0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
149f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
14a00 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61   Copy the filena
14a10 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79  me and any query
14a20 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f   parameters into
14a30 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65   the zFile buffe
14a40 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64  r. .    ** Decod
14a50 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64  e %HH escape cod
14a60 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79  es along the way
14a70 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
14a80 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   Within this loo
14a90 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61  p, variable eSta
14aa0 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  te may be set to
14ab0 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65   0, 1 or 2, depe
14ac0 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  nding.    ** on 
14ad0 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  the parsing cont
14ae0 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  ext. As follows:
14af0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
14b00 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65   0: Parsing file
14b10 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20  -name..    **   
14b20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20  1: Parsing name 
14b30 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
14b40 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
14b50 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20  rameter..    ** 
14b60 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c    2: Parsing val
14b70 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  ue section of a 
14b80 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
14b90 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
14ba0 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20  */.    eState = 
14bb0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
14bc0 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30   = zUri[iIn])!=0
14bd0 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20   && c!='#' ){.  
14be0 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
14bf0 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20   if( c=='%' .   
14c00 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
14c10 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d  xdigit(zUri[iIn]
14c20 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ) .       && sql
14c30 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72  ite3Isxdigit(zUr
14c40 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20  i[iIn+1]) .     
14c50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
14c60 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33  octet = (sqlite3
14c70 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
14c80 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20  n++]) << 4);.   
14c90 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71       octet += sq
14ca0 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55  lite3HexToInt(zU
14cb0 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20  ri[iIn++]);..   
14cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74       assert( oct
14cd0 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32  et>=0 && octet<2
14ce0 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  56 );.        if
14cf0 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20  ( octet==0 ){.  
14d00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
14d10 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
14d20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61  when "%00" appea
14d30 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52  rs within the UR
14d40 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20  I. In this.     
14d50 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20       ** case we 
14d60 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20  ignore all text 
14d70 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  in the remainder
14d80 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61   of the path, na
14d90 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  me or.          
14da0 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74  ** value current
14db0 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e  ly being parsed.
14dc0 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   So ignore the c
14dd0 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72  urrent character
14de0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
14df0 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65  d skip to the ne
14e00 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22  xt "?", "=" or "
14e10 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  &", as appropria
14e20 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
14e30 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
14e40 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
14e50 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='#' .          
14e60 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
14e70 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20  0 || c!='?').   
14e80 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
14e90 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d  State!=1 || (c!=
14ea0 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a  '=' && c!='&')).
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
14ec0 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63   (eState!=2 || c
14ed0 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20  !='&').         
14ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14ef0 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
14f00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
14f10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
14f20 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74  .        c = oct
14f30 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  et;.      }else 
14f40 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26  if( eState==1 &&
14f50 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27   (c=='&' || c=='
14f60 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =') ){.        i
14f70 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d  f( zFile[iOut-1]
14f80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14f90 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74   /* An empty opt
14fa0 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65  ion name. Ignore
14fb0 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74   this option alt
14fc0 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  ogether. */.    
14fd0 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
14fe0 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
14ff0 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69  In]!='#' && zUri
15000 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69  [iIn-1]!='&' ) i
15010 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
15020 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15030 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15040 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20  c=='&' ){.      
15050 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
15060 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
15070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15080 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20     eState = 2;. 
15090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
150a0 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   c = 0;.      }e
150b0 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d  lse if( (eState=
150c0 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c  =0 && c=='?') ||
150d0 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63   (eState==2 && c
150e0 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20  =='&') ){.      
150f0 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
15100 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20   eState = 1;.   
15110 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65     }.      zFile
15120 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [iOut++] = c;.  
15130 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61    }.    if( eSta
15140 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f  te==1 ) zFile[iO
15150 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
15160 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
15170 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
15180 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
15190 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
151a0 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e  if there were an
151b0 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66  y options specif
151c0 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ied that should 
151d0 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a  be interpreted .
151e0 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74      ** here. Opt
151f0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e  ions that are in
15200 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69  terpreted here i
15210 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64  nclude "vfs" and
15220 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20   those that.    
15230 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ** correspond to
15240 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20   flags that may 
15250 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  be passed to the
15260 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
15270 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ().    ** method
15280 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20  . */.    zOpt = 
15290 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74  &zFile[sqlite3St
152a0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d  rlen30(zFile)+1]
152b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70  ;.    while( zOp
152c0 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  t[0] ){.      in
152d0 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  t nOpt = sqlite3
152e0 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a  Strlen30(zOpt);.
152f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c        char *zVal
15300 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d   = &zOpt[nOpt+1]
15310 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  ;.      int nVal
15320 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15330 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20  30(zVal);..     
15340 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20   if( nOpt==3 && 
15350 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f  memcmp("vfs", zO
15360 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 3)==0 ){.   
15370 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c       zVfs = zVal
15380 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15390 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70         struct Op
153a0 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20  enMode {.       
153b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
153c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
153d0 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20  mode;.        } 
153e0 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  *aMode = 0;.    
153f0 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54      char *zModeT
15400 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ype = 0;.       
15410 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20   int mask = 0;. 
15420 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74         int limit
15430 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69   = 0;..        i
15440 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65  f( nOpt==5 && me
15450 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f  mcmp("cache", zO
15460 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 5)==0 ){.   
15470 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
15480 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43  ruct OpenMode aC
15490 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  acheMode[] = {. 
154a0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68             { "sh
154b0 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f  ared",  SQLITE_O
154c0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
154d0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
154e0 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49   "private", SQLI
154f0 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
15500 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  ACHE },.        
15510 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
15520 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
15530 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
15540 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
15550 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  CHE|SQLITE_OPEN_
15560 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20  PRIVATECACHE;.  
15570 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
15580 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20  aCacheMode;.    
15590 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
155a0 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  sk;.          zM
155b0 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65  odeType = "cache
155c0 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
155d0 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34       if( nOpt==4
155e0 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65   && memcmp("mode
155f0 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29  ", zOpt, 4)==0 )
15600 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
15610 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f  ic struct OpenMo
15620 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d  de aOpenMode[] =
15630 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
15640 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "ro",  SQLITE_O
15650 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a  PEN_READONLY },.
15660 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
15670 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  w",  SQLITE_OPEN
15680 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20  _READWRITE }, . 
15690 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
156a0 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  c", SQLITE_OPEN_
156b0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
156c0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
156d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
156e0 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45  "memory", SQLITE
156f0 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a  _OPEN_MEMORY },.
15700 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
15710 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
15720 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
15730 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
15740 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54  READONLY | SQLIT
15750 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
15760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15770 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
15780 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
15790 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20  E_OPEN_MEMORY;. 
157a0 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
157b0 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20   aOpenMode;.    
157c0 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
157d0 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20  sk & flags;.    
157e0 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
157f0 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20  = "access";.    
15800 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
15810 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20  f( aMode ){.    
15820 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
15830 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20         int mode 
15840 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
15850 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d  or(i=0; aMode[i]
15860 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .z; i++){.      
15870 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15880 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a   *z = aMode[i].z
15890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
158a0 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53  ( nVal==sqlite3S
158b0 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d  trlen30(z) && 0=
158c0 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c  =memcmp(zVal, z,
158d0 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20   nVal) ){.      
158e0 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61          mode = a
158f0 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20  Mode[i].mode;.  
15900 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15910 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
15920 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15930 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d         if( mode=
15940 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15950 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
15960 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
15970 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20  o such %s mode: 
15980 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20  %s", zModeType, 
15990 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
159a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
159b0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
159c0 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
159d0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
159e0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
159f0 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f  (mode & ~SQLITE_
15a00 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d  OPEN_MEMORY)>lim
15a10 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
15a20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
15a30 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
15a40 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77  s mode not allow
15a50 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ed: %s",.       
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
15a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
15aa0 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  c = SQLITE_PERM;
15ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
15ac0 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
15ad0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15ae0 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28         flags = (
15af0 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c  flags & ~mask) |
15b00 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
15b10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15b20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61  zOpt = &zVal[nVa
15b30 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  l+1];.    }..  }
15b40 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20  else{.    zFile 
15b50 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
15b60 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20  64(nUri+2);.    
15b70 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
15b80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15b90 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69  ;.    memcpy(zFi
15ba0 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  le, zUri, nUri);
15bb0 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d  .    zFile[nUri]
15bc0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
15bd0 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30  le[nUri+1] = '\0
15be0 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ';.    flags &= 
15bf0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  ~SQLITE_OPEN_URI
15c00 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20  ;.  }..  *ppVfs 
15c10 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
15c20 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
15c30 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20  *ppVfs==0 ){.   
15c40 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
15c50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
15c60 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
15c70 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  zVfs);.    rc = 
15c80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15c90 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  }. parse_uri_out
15ca0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
15cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
15cc0 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29  ite3_free(zFile)
15cd0 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b  ;.    zFile = 0;
15ce0 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d  .  }.  *pFlags =
15cf0 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c   flags;.  *pzFil
15d00 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74  e = zFile;.  ret
15d10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
15d20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
15d30 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
15d40 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61  opening a databa
15d50 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a  se on behalf of.
15d60 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
15d70 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70  ) and sqlite3_op
15d80 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61  en16(). The data
15d90 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a  base filename "z
15da0 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69  Filename"  .** i
15db0 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e  s UTF-8 encoded.
15dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
15dd0 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63  penDatabase(.  c
15de0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
15df0 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73  name, /* Databas
15e00 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38  e filename UTF-8
15e10 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71   encoded */.  sq
15e20 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
15e30 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
15e40 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68  urned database h
15e50 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67  andle */.  unsig
15e60 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  ned int flags,  
15e70 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c    /* Operational
15e80 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
15e90 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
15ea0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15eb0 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  e VFS to use */.
15ec0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15ee0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c       /* Store al
15ef0 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68  located handle h
15f00 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ere */.  int rc;
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
15f30 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
15f40 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20   isThreadsafe;  
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f60 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73  True for threads
15f70 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  afe connections 
15f80 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e  */.  char *zOpen
15f90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15fa0 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
15fb0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   argument to pas
15fc0 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29  s to BtreeOpen()
15fd0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   */.  char *zErr
15fe0 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Msg = 0;        
15ff0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
16000 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69  essage from sqli
16010 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f  te3ParseUri() */
16020 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
16030 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
16040 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29  .  if( ppDb==0 )
16050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
16060 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
16070 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  if.  *ppDb = 0;.
16080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16090 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
160a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
160b0 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
160c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
160d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c  #endif..  /* Onl
160e0 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65  y allow sensible
160f0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
16100 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61   bits in the fla
16110 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20  gs argument.  . 
16120 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72   ** Throw an err
16130 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65  or if any non-se
16140 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  nse combination 
16150 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a  is used.  If we.
16160 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63    ** do not bloc
16170 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e  k illegal combin
16180 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20  ations here, it 
16190 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20  could trigger.  
161a0 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ** assert() stat
161b0 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72  ements in deeper
161c0 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62   layers.  Sensib
161d0 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a  le combinations.
161e0 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20    ** are:.  **. 
161f0 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f   **  1:  SQLITE_
16200 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  OPEN_READONLY.  
16210 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f  **  2:  SQLITE_O
16220 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
16230 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f  **  6:  SQLITE_O
16240 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
16250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16260 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  TE.  */.  assert
16270 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
16280 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20  ADONLY  == 0x01 
16290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
162a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
162b0 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20  TE == 0x02 );.  
162c0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
162d0 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d  PEN_CREATE    ==
162e0 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63   0x04 );.  testc
162f0 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
16300 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20  7))==0x02 ); /* 
16310 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65  READONLY */.  te
16320 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
16330 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20  gs&7))==0x04 ); 
16340 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a  /* READWRITE */.
16350 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
16360 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30  (flags&7))==0x40
16370 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
16380 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69   | CREATE */.  i
16390 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37  f( ((1<<(flags&7
163a0 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b  )) & 0x46)==0 ){
163b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
163c0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20  TE_MISUSE_BKPT; 
163d0 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37   /* IMP: R-65497
163e0 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20  -44594 */.  }.. 
163f0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
16400 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
16410 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
16420 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
16430 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
16440 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
16450 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
16460 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
16470 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
16480 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
16490 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
164a0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
164b0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
164c0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
164d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
164e0 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
164f0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
16500 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  & SQLITE_OPEN_PR
16510 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20  IVATECACHE ){.  
16520 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
16530 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
16540 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CHE;.  }else if(
16550 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
16560 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
16570 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66  Enabled ){.    f
16580 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
16590 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
165a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
165b0 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66  e harmful bits f
165c0 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61  rom the flags pa
165d0 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a  rameter.  **.  *
165e0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  * The SQLITE_OPE
165f0 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51  N_NOMUTEX and SQ
16600 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
16610 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20  TEX flags were. 
16620 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69   ** dealt with i
16630 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
16640 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69  ode block.  Besi
16650 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f  des these, the o
16660 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69  nly.  ** valid i
16670 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73  nput flags for s
16680 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
16690 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   are SQLITE_OPEN
166a0 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20  _READONLY,.  ** 
166b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
166c0 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  WRITE, SQLITE_OP
166d0 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54  EN_CREATE, SQLIT
166e0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
166f0 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  HE,.  ** SQLITE_
16700 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
16710 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65  E, and some rese
16720 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65  rved bits.  Sile
16730 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
16740 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
16750 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
16760 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
16770 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
16780 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
16790 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
167a0 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
167b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
167c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
167e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
167f0 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
16800 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16810 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
16820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16830 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
16840 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
16850 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16860 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
16870 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
16880 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
16890 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
168b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
168c0 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
168d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
168e0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
168f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16900 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
16910 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
16920 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16930 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
16940 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
16950 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
16960 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
16970 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
16980 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
16990 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
169a0 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
169b0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
169c0 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
169d0 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74  e ){.    db->mut
169e0 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
169f0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
16a00 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
16a10 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65      if( db->mute
16a20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x==0 ){.      sq
16a30 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
16a40 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20        db = 0;.  
16a50 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
16a60 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
16a70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
16a80 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
16a90 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
16aa0 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62   0xff;.  db->nDb
16ab0 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69   = 2;.  db->magi
16ac0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
16ad0 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62  _BUSY;.  db->aDb
16ae0 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
16af0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ;..  assert( siz
16b00 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d  eof(db->aLimit)=
16b10 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d  =sizeof(aHardLim
16b20 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  it) );.  memcpy(
16b30 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72  db->aLimit, aHar
16b40 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64  dLimit, sizeof(d
16b50 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64  b->aLimit));.  d
16b60 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
16b70 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
16b80 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f  READS] = SQLITE_
16b90 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54  DEFAULT_WORKER_T
16ba0 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75  HREADS;.  db->au
16bb0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
16bc0 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
16bd0 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d  = -1;.  db->szMm
16be0 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ap = sqlite3Glob
16bf0 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
16c00 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  .  db->nextPages
16c10 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  ize = 0;.  db->n
16c20 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
16c30 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62  0x7FFFFFFF;.  db
16c40 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
16c50 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20  E_ShortColNames 
16c60 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
16c70 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f  rigger | SQLITE_
16c80 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21  CacheSpill.#if !
16c90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
16ca0 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
16cb0 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54  _INDEX) || SQLIT
16cc0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
16cd0 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20  TIC_INDEX.      
16ce0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
16cf0 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65  ITE_AutoIndex.#e
16d00 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
16d10 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c  DEFAULT_CKPTFULL
16d20 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20  FSYNC.          
16d30 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
16d40 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65  CkptFullFSync.#e
16d50 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
16d60 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
16d70 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
16d80 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
16d90 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
16da0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
16db0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
16dc0 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
16dd0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
16de0 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
16df0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
16e00 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
16e10 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e30 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
16e40 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
16e50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
16e60 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
16e70 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
16e80 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
16e90 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
16ea0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
16eb0 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
16ec0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
16ed0 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44  TE_REVERSE_UNORD
16ee0 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20  ERED_SELECTS).  
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16f00 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
16f10 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20  rder.#endif.#if 
16f20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
16f30 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
16f40 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20  ELL_CHECK).     
16f50 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16f60 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a  LITE_CellSizeCk.
16f70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
16f80 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
16f90 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
16fa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16fb0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16fc0 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
16fd0 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
16fe0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
16ff0 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
17000 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
17010 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
17020 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
17030 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
17040 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
17050 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
17060 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
17070 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
17080 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
17090 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
170a0 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
170b0 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
170c0 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ilure..  **.  **
170d0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
170e0 35 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69  52786-44878 SQLi
170f0 74 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65  te defines three
17100 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
17110 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  ing.  ** functio
17120 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74  ns:.  */.  creat
17130 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
17140 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
17150 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  UTF8, 0, binColl
17160 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
17170 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
17180 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
17190 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e  _UTF16BE, 0, bin
171a0 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
171b0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
171c0 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
171d0 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c  LITE_UTF16LE, 0,
171e0 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
171f0 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
17200 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22  ion(db, "NOCASE"
17210 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
17220 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  , nocaseCollatin
17230 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  gFunc, 0);.  cre
17240 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
17250 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45   "RTRIM", SQLITE
17260 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c  _UTF8, (void*)1,
17270 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
17280 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
17290 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
172a0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
172b0 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e  .  }.  /* EVIDEN
172c0 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31  CE-OF: R-08308-1
172d0 37 32 32 34 20 54 68 65 20 64 65 66 61 75 6c 74  7224 The default
172e0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
172f0 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a  ion for all.  **
17300 20 73 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41   strings is BINA
17310 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  RY. .  */.  db->
17320 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
17330 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
17340 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
17350 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20  "BINARY", 0);.  
17360 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
17370 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
17380 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65  * Parse the file
17390 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e  name/URI argumen
173a0 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  t. */.  db->open
173b0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
173c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72   rc = sqlite3Par
173d0 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c  seUri(zVfs, zFil
173e0 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26  ename, &flags, &
173f0 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e  db->pVfs, &zOpen
17400 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
17410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17420 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
17430 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64  SQLITE_NOMEM ) d
17440 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17450 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
17460 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
17470 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22   rc, zErrMsg ? "
17480 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67  %s" : 0, zErrMsg
17490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
174a0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
174b0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
174c0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  t;.  }..  /* Ope
174d0 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
174e0 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
174f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
17500 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
17510 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64  s, zOpen, db, &d
17520 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
17530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17540 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
17550 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
17560 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
17570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17580 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17590 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
175a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
175b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
175c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
175d0 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f  (db, rc);.    go
175e0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
175f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
17600 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30  eEnter(db->aDb[0
17610 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
17620 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[0].pSchema = s
17630 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
17640 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  db, db->aDb[0].p
17650 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e  Bt);.  if( !db->
17660 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45  mallocFailed ) E
17670 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f  NC(db) = SCHEMA_
17680 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ENC(db);.  sqlit
17690 65 33 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d  e3BtreeLeave(db-
176a0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
176b0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
176c0 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
176d0 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20  maGet(db, 0);.. 
176e0 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   /* The default 
176f0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72  safety_level for
17700 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
17710 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f  se is 'full'; fo
17720 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20  r the temp.  ** 
17730 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20 27  database it is '
17740 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63  NONE'. This matc
17750 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61  hes the pager la
17760 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a  yer defaults.  .
17770 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30    */.  db->aDb[0
17780 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22  ].zName = "main"
17790 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  ;.  db->aDb[0].s
177a0 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b  afety_level = 3;
177b0 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e  .  db->aDb[1].zN
177c0 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20  ame = "temp";.  
177d0 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74  db->aDb[1].safet
177e0 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20  y_level = 1;..  
177f0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
17800 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20  TE_MAGIC_OPEN;. 
17810 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
17820 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
17830 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
17840 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
17850 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75   all built-in fu
17860 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20  nctions, but do 
17870 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72  not attempt to r
17880 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  ead the.  ** dat
17890 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74  abase schema yet
178a0 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65  . This is delaye
178b0 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  d until the firs
178c0 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
178d0 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65  ase.  ** is acce
178e0 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ssed..  */.  sql
178f0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
17900 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
17910 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
17920 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
17930 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
17940 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
17950 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
17960 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
17970 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
17980 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
17990 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
179a0 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
179b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
179c0 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28  rcode(db);.  if(
179d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
179e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  {.    sqlite3Aut
179f0 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28  oLoadExtensions(
17a00 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  db);.    rc = sq
17a10 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
17a20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
17a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17a40 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
17a50 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  t;.    }.  }..#i
17a60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17a70 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64  LE_FTS1.  if( !d
17a80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17a90 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
17aa0 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  t sqlite3Fts1Ini
17ab0 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
17ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
17ad0 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  1Init(db);.  }.#
17ae0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
17af0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32  LITE_ENABLE_FTS2
17b00 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17b10 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
17b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17b30 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
17b40 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69  te3Fts2Init(sqli
17b50 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
17b60 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
17b70 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
17b80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17b90 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28  NABLE_FTS3.  if(
17ba0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17bb0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
17bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
17bd0 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
17be0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
17bf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17c00 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20  NABLE_ICU.  if( 
17c10 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
17c20 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
17c30 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
17c40 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
17c50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
17c60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17c70 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
17c80 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
17c90 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
17ca0 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
17cb0 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
17cc0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
17cd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17ce0 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42  ABLE_DBSTAT_VTAB
17cf0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17d00 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
17d10 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
17d20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74  rc = sqlite3Dbst
17d30 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a  atRegister(db);.
17d40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
17d50 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
17d60 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31  T_LOCKING_MODE=1
17d70 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45   makes EXCLUSIVE
17d80 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
17d90 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
17da0 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
17db0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30  T_LOCKING_MODE=0
17dc0 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65   make NORMAL the
17dd0 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
17de0 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69  .  ** mode.  Doi
17df0 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c  ng nothing at al
17e00 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52  l also makes NOR
17e10 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e  MAL the default.
17e20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
17e30 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
17e40 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64  ING_MODE.  db->d
17e50 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51  fltLockMode = SQ
17e60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
17e70 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c  KING_MODE;.  sql
17e80 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
17e90 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
17ea0 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
17eb0 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
17ee0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a  _LOCKING_MODE);.
17ef0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
17f00 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28   ) sqlite3Error(
17f10 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45  db, rc);..  /* E
17f20 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73  nable the lookas
17f30 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79  ide-malloc subsy
17f40 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c  stem */.  setupL
17f50 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20  ookaside(db, 0, 
17f60 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17f70 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c  fig.szLookaside,
17f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17fa0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
17fb0 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c  okaside);..  sql
17fc0 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
17fd0 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49  ckpoint(db, SQLI
17fe0 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41  TE_DEFAULT_WAL_A
17ff0 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a  UTOCHECKPOINT);.
18000 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73  .opendb_out:.  s
18010 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65  qlite3_free(zOpe
18020 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  n);.  if( db ){.
18030 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
18040 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68  mutex!=0 || isTh
18050 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20 20 20  readsafe==0.    
18060 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
18070 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
18080 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  ullMutex==0 );. 
18090 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
180a0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
180b0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
180c0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
180d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  );.  assert( db!
180e0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
180f0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20  _NOMEM );.  if( 
18100 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
18110 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18120 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64  close(db);.    d
18130 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  b = 0;.  }else i
18140 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18150 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
18160 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
18170 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70  _SICK;.  }.  *pp
18180 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20  Db = db;.#ifdef 
18190 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
181a0 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74  LLOG.  if( sqlit
181b0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
181c0 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a  Sqllog ){.    /*
181d0 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61   Opening a db ha
181e0 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
181f0 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
18200 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20   0. */.    void 
18210 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47  *pArg = sqlite3G
18220 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
18230 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69  logArg;.    sqli
18240 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18250 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62  xSqllog(pArg, db
18260 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  , zFilename, 0);
18270 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
18280 74 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a  turn rc & 0xff;.
18290 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
182a0 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
182b0 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
182c0 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
182d0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
182e0 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
182f0 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
18300 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
18310 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18330 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18340 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
18350 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
18360 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
18370 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
18380 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
18390 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
183a0 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
183b0 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
183c0 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
183d0 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
183e0 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
183f0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
18400 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
18410 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
18420 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
18430 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
18440 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
18450 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
18460 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
18470 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
18480 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
18490 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
184a0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
184b0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
184c0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
184d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
184e0 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
184f0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
18500 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
18510 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
18520 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
18530 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
18540 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
18550 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
18560 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
18570 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
18580 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
18590 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
185a0 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62  ARMOR.  if( ppDb
185b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
185c0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
185d0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20  .#endif.  *ppDb 
185e0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
185f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
18600 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
18610 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
18620 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
18630 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
18640 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
18650 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30   zFilename = "\0
18660 30 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20  00\000";.  pVal 
18670 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
18680 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
18690 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
186a0 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
186b0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
186c0 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
186d0 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
186e0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
186f0 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
18700 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
18710 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
18720 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
18730 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
18740 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
18750 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18760 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
18770 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
18780 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73  EATE, 0);.    as
18790 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72  sert( *ppDb || r
187a0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
187b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
187c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48  QLITE_OK && !DbH
187d0 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62  asProperty(*ppDb
187e0 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
187f0 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53  aded) ){.      S
18800 43 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29  CHEMA_ENC(*ppDb)
18810 20 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20   = ENC(*ppDb) = 
18820 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
18830 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  VE;.    }.  }els
18840 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
18850 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
18860 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
18870 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
18880 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23  n rc & 0xff;.}.#
18890 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
188a0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
188b0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
188c0 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
188d0 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
188e0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
188f0 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
18900 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
18910 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
18920 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
18930 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
18940 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
18950 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
18960 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
18970 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
18980 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
18990 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
189a0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
189b0 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  n_v2(db, zName, 
189c0 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
189d0 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  are, 0);.}../*.*
189e0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
189f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
18a00 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
18a10 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
18a20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
18a30 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
18a40 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
18a50 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
18a60 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
18a70 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
18a80 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
18a90 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
18aa0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
18ab0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
18ac0 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
18ad0 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
18ae0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18af0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
18b00 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
18b10 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
18b20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  || zName==0 ) re
18b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
18b40 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
18b50 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18b60 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
18b70 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
18b80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
18b90 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
18ba0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
18bb0 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  e, (u8)enc, pCtx
18bc0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c  , xCompare, xDel
18bd0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18be0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
18bf0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
18c00 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
18c10 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
18c20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
18c30 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
18c40 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
18c50 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
18c60 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
18c70 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
18c80 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
18c90 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
18ca0 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a  on16(.  sqlite3*
18cb0 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f   db, .  const vo
18cc0 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  id *zName,.  int
18cd0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
18ce0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
18cf0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
18d00 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
18d10 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
18d20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18d30 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
18d40 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  ame8;..#ifdef SQ
18d50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
18d60 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
18d70 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
18d80 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
18d90 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
18da0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
18db0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
18dc0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
18dd0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
18de0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18df0 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
18e00 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
18e10 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  8(db, zName, -1,
18e20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
18e30 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  IVE);.  if( zNam
18e40 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  e8 ){.    rc = c
18e50 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
18e60 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65  b, zName8, (u8)e
18e70 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
18e80 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
18e90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
18ea0 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
18eb0 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
18ec0 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
18ed0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
18ee0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
18ef0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
18f00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
18f10 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
18f20 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
18f30 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
18f40 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
18f50 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
18f60 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
18f70 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
18f80 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
18f90 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
18fa0 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
18fb0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
18fc0 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
18fd0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
18fe0 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
18ff0 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
19000 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
19010 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
19020 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
19030 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53  ar*).){.#ifdef S
19040 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
19050 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
19060 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
19070 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
19080 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
19090 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
190a0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
190b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
190c0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
190d0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
190e0 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
190f0 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
19100 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
19110 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
19120 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
19130 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
19140 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19150 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
19160 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
19170 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
19180 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
19190 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
191a0 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
191b0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
191c0 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
191d0 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
191e0 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
191f0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
19200 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
19210 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
19220 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
19230 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
19240 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
19250 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
19260 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
19270 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
19280 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
19290 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
192a0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
192b0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
192c0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
192d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
192e0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
192f0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
19300 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
19310 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
19320 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  llNeeded = 0;.  
19330 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
19340 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31  6 = xCollNeeded1
19350 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  6;.  db->pCollNe
19360 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
19370 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
19380 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19390 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
193a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
193b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
193c0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
193d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
193e0 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
193f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19400 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61  tion is now an a
19410 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75  nachronism. It u
19420 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74  sed to be used t
19430 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
19440 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  .** malloc() fai
19450 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65  lure, but SQLite
19460 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61   now does this a
19470 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f  utomatically..*/
19480 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .int sqlite3_glo
19490 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64  bal_recover(void
194a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
194b0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
194c0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
194d0 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
194e0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
194f0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
19500 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f  autocommit.** mo
19510 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
19520 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41   if it is and FA
19530 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74  LSE if not.  Aut
19540 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20  ocommit mode is 
19550 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  on.** by default
19560 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73  .  Autocommit is
19570 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42   disabled by a B
19580 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61  EGIN statement a
19590 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20  nd reenabled.** 
195a0 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d  by the next COMM
195b0 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a  IT or ROLLBACK..
195c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
195d0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71  et_autocommit(sq
195e0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
195f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19600 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
19610 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
19620 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
19630 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
19640 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
19650 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
19660 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
19670 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
19680 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
19690 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
196a0 65 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f  e substitutes fo
196b0 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
196c0 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
196d0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
196e0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
196f0 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20  QLITE_IOERR and 
19700 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
19710 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
19720 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74  s.  They serve t
19730 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
19740 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
19750 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
19760 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
19770 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
19780 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
19790 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
197a0 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
197b0 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
197c0 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
197d0 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
197e0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
197f0 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
19800 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
19810 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
19820 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
19830 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
19840 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
19850 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
19860 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
19870 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19880 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
19890 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
198a0 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20  _CORRUPT,.      
198b0 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73          "databas
198c0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20  e corruption at 
198d0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
198e0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
198f0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
19900 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
19910 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19920 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e  TE_CORRUPT;.}.in
19930 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
19940 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
19950 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
19960 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19970 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
19980 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
19990 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20  E_MISUSE, .     
199a0 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65           "misuse
199b0 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
199c0 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
199d0 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
199e0 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
199f0 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
19a00 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d  SQLITE_MISUSE;.}
19a10 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74  .int sqlite3Cant
19a20 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69  openError(int li
19a30 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
19a40 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
19a50 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
19a60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
19a70 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
19a80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19a90 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
19aa0 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
19ab0 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
19ac0 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
19ad0 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
19ae0 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
19af0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
19b00 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
19b10 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
19b20 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
19b30 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  is a convenience
19b40 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61   routine that ma
19b50 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c  kes sure that al
19b60 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  l thread-specifi
19b70 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68  c.** data for th
19b80 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65  is thread has be
19b90 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a  en deallocated..
19ba0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20  **.** SQLite no 
19bb0 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65  longer uses thre
19bc0 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
19bd0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
19be0 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d   is now a.** no-
19bf0 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69  op.  It is retai
19c00 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ned for historic
19c10 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  al compatibility
19c20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19c30 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
19c40 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66  (void){.}.#endif
19c50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d  ../*.** Return m
19c60 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
19c70 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63  about a specific
19c80 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74   column of a dat
19c90 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
19ca0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73  See comment in s
19cb0 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65  qlite3.h (sqlite
19cc0 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69  .h.in) for detai
19cd0 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
19ce0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
19cf0 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
19d00 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
19d10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
19d20 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
19d30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
19d40 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
19d50 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
19d60 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
19d70 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
19d80 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
19d90 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
19da0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
19db0 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
19dc0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
19dd0 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
19de0 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
19df0 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
19e00 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
19e10 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
19e20 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
19e30 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
19e40 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
19e50 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
19e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
19e70 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
19e80 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
19e90 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
19ea0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
19eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
19ec0 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
19ed0 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
19ee0 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f00 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
19f10 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
19f20 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
19f30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
19f40 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
19f50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
19f60 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
19f70 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
19f80 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  l = 0;.  char co
19f90 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d  nst *zDataType =
19fa0 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
19fb0 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a   *zCollSeq = 0;.
19fc0 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20    int notnull = 
19fd0 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  0;.  int primary
19fe0 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  key = 0;.  int a
19ff0 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69  utoinc = 0;...#i
1a000 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a010 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1a020 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1a030 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
1a040 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b  zTableName==0 ){
1a050 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a060 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1a070 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a080 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61   Ensure the data
1a090 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
1a0a0 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  been loaded */. 
1a0b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a0c0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1a0d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a0e0 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72  nterAll(db);.  r
1a0f0 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28  c = sqlite3Init(
1a100 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  db, &zErrMsg);. 
1a110 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1a120 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  rc ){.    goto e
1a130 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
1a140 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74   /* Locate the t
1a150 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
1a160 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   */.  pTab = sql
1a170 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
1a180 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44  , zTableName, zD
1a190 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70  bName);.  if( !p
1a1a0 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  Tab || pTab->pSe
1a1b0 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62  lect ){.    pTab
1a1c0 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 0;.    goto e
1a1d0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
1a1e0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c   /* Find the col
1a1f0 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e  umn for which in
1a200 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20  fo is requested 
1a210 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e  */.  if( zColumn
1a220 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
1a230 2a 20 51 75 65 72 79 20 66 6f 72 20 65 78 69 73  * Query for exis
1a240 74 61 6e 63 65 20 6f 66 20 74 61 62 6c 65 20 6f  tance of table o
1a250 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  nly */.  }else{.
1a260 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
1a270 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
1a280 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
1a290 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
1a2a0 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
1a2b0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
1a2c0 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
1a2d0 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
1a2e0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1a2f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a300 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
1a310 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
1a320 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
1a330 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 49  Tab) && sqlite3I
1a340 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61  sRowid(zColumnNa
1a350 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  me) ){.        i
1a360 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
1a370 79 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 20  y;.        pCol 
1a380 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61  = iCol>=0 ? &pTa
1a390 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20  b->aCol[iCol] : 
1a3a0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1a3b0 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 30          pTab = 0
1a3c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1a3d0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  rror_out;.      
1a3e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1a3f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1a400 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
1a410 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
1a420 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
1a430 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
1a440 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
1a450 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
1a460 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
1a470 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
1a480 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
1a490 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
1a4a0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
1a4b0 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
1a4c0 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
1a4d0 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
1a4e0 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
1a4f0 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
1a500 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
1a510 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
1a520 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
1a530 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
1a540 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
1a550 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
1a560 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
1a570 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
1a580 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
1a590 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
1a5a0 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
1a5b0 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
1a5c0 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
1a5d0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
1a5e0 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
1a5f0 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
1a600 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
1a610 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
1a620 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
1a630 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
1a640 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
1a650 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
1a660 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  = (pCol->colFlag
1a670 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
1a680 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74  KEY)!=0;.    aut
1a690 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
1a6a0 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
1a6b0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1a6c0 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
1a6d0 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
1a6e0 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
1a6f0 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
1a700 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
1a710 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
1a720 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
1a730 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
1a740 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
1a750 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
1a760 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
1a770 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
1a780 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
1a790 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
1a7a0 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
1a7b0 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
1a7c0 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
1a7d0 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
1a7e0 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
1a7f0 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
1a800 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
1a810 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
1a820 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
1a830 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
1a840 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
1a850 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
1a860 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
1a870 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
1a880 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
1a890 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
1a8a0 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
1a8b0 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
1a8c0 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
1a8d0 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
1a8e0 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
1a8f0 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
1a900 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
1a910 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
1a920 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
1a930 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1a940 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1a950 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
1a960 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1a970 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
1a980 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
1a990 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
1a9a0 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
1a9b0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
1a9c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1a9d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
1a9e0 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45  hMsg(db, rc, (zE
1a9f0 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
1aa00 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1aa10 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1aa20 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
1aa30 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
1aa40 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
1aa50 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1aa60 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1aa70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c   rc;.}../*.** Sl
1aa80 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
1aa90 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
1aaa0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
1aab0 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74  me slept..*/.int
1aac0 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69   sqlite3_sleep(i
1aad0 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65  nt ms){.  sqlite
1aae0 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69  3_vfs *pVfs;.  i
1aaf0 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20  nt rc;.  pVfs = 
1ab00 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1ab10 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d  (0);.  if( pVfs=
1ab20 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
1ab30 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
1ab40 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c  on works in mill
1ab50 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68  iseconds, but th
1ab60 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53  e underlying OsS
1ab70 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49  leep() .  ** API
1ab80 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e   uses microsecon
1ab90 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30  ds. Hence the 10
1aba0 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  00's..  */.  rc 
1abb0 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  = (sqlite3OsSlee
1abc0 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29  p(pVfs, 1000*ms)
1abd0 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  /1000);.  return
1abe0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
1abf0 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
1ac00 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73  the extended res
1ac10 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e  ult codes..*/.in
1ac20 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
1ac30 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
1ac40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1ac50 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66 20   onoff){.#ifdef 
1ac60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1ac70 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1ac80 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1ac90 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
1aca0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1acb0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1acc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1acd0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1ace0 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e  db->errMask = on
1acf0 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66  off ? 0xffffffff
1ad00 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74   : 0xff;.  sqlit
1ad10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1ad20 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
1ad30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ad40 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
1ad50 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  he xFileControl 
1ad60 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74  method on a part
1ad70 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e  icular database.
1ad80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1ad90 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c  file_control(sql
1ada0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1adb0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69  char *zDbName, i
1adc0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1add0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ade0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42  QLITE_ERROR;.  B
1adf0 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23  tree *pBtree;..#
1ae00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ae10 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1ae20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1ae30 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1ae40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1ae50 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1ae60 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1ae70 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1ae80 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73  x);.  pBtree = s
1ae90 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1aea0 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1aeb0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1aec0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
1aed0 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
1aee0 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73  _file *fd;.    s
1aef0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1af00 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50  (pBtree);.    pP
1af10 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
1af20 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29  reePager(pBtree)
1af30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1af40 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66  ager!=0 );.    f
1af50 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
1af60 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
1af70 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20    assert( fd!=0 
1af80 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
1af90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
1afa0 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1afb0 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
1afc0 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
1afd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1afe0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
1aff0 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
1b000 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1b010 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1b020 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
1b030 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b040 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1b050 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20  TFOUND;.    }.  
1b060 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b070 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1b080 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b090 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1b0a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b0b0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
1b0c0 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
1b0d0 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
1b0e0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1b0f0 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
1b100 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1b110 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1b120 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
1b130 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b140 54 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20  TER(op);.#else. 
1b150 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
1b160 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
1b170 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1b180 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1b190 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
1b1a0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
1b1b0 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  NG..    */.    c
1b1c0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1b1d0 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b  TRL_PRNG_SAVE: {
1b1e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
1b1f0 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20  ngSaveState();. 
1b200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b210 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1b220 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61   Restore the sta
1b230 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74  te of the PRNG t
1b240 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65  o the last state
1b250 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20   saved using.   
1b260 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20   ** PRNG_SAVE.  
1b270 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73  If PRNG_SAVE has
1b280 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1b290 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a  en called, then.
1b2a0 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62      ** this verb
1b2b0 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f   acts like PRNG_
1b2c0 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20  RESET..    */.  
1b2d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1b2e0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
1b2f0 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ORE: {.      sql
1b300 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53  ite3PrngRestoreS
1b310 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
1b320 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1b330 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20  /*.    ** Reset 
1b340 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f  the PRNG back to
1b350 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a   its uninitializ
1b360 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e  ed state.  The n
1b370 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ext call.    ** 
1b380 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  to sqlite3_rando
1b390 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73  mness() will res
1b3a0 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69  eed the PRNG usi
1b3b0 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c  ng a single call
1b3c0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  .    ** to the x
1b3d0 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f  Randomness metho
1b3e0 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  d of the default
1b3f0 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   VFS..    */.   
1b400 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1b410 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
1b420 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1b430 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30  3_randomness(0,0
1b440 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b450 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1b460 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1b470 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45  st_control(BITVE
1b480 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72  C_TEST, size, pr
1b490 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20  ogram).    **.  
1b4a0 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20    ** Run a test 
1b4b0 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63  against a Bitvec
1b4c0 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e   object of size.
1b4d0 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72    The program ar
1b4e0 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73  gument.    ** is
1b4f0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
1b500 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e  egers that defin
1b510 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65  es the test.  Re
1b520 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20  turn -1 on a.   
1b530 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
1b540 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f  ation error, 0 o
1b550 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f  n success, or no
1b560 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72  n-zero for an er
1b570 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  ror..    ** See 
1b580 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65  the sqlite3Bitve
1b590 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66  cBuiltinTest() f
1b5a0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1b5b0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
1b5c0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1b5d0 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
1b5e0 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20  C_TEST: {.      
1b5f0 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
1b600 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1b610 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f  int *aProg = va_
1b620 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
1b630 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b640 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
1b650 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20  st(sz, aProg);. 
1b660 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b670 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1b680 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1b690 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53  ontrol(FAULT_INS
1b6a0 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29  TALL, xCallback)
1b6b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1b6c0 72 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65  rrange to invoke
1b6d0 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65   xCallback() whe
1b6e0 6e 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75  never sqlite3Fau
1b6f0 6c 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65  ltSim() is calle
1b700 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61  d,.    ** if xCa
1b710 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55  llback is not NU
1b720 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  LL..    **.    *
1b730 2a 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74  * As a test of t
1b740 68 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74  he fault simulat
1b750 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73  or mechanism its
1b760 65 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c  elf, sqlite3Faul
1b770 74 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69  tSim(0).    ** i
1b780 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61  s called immedia
1b790 74 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61  tely after insta
1b7a0 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61  lling the new ca
1b7b0 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72  llback and the r
1b7c0 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c  eturn.    ** val
1b7d0 75 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46  ue from sqlite3F
1b7e0 61 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d  aultSim(0) becom
1b7f0 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  es the return fr
1b800 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
1b810 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29  3_test_control()
1b820 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1b830 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1b840 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a  L_FAULT_INSTALL:
1b850 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43   {.      /* MSVC
1b860 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20   is picky about 
1b870 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72  pulling func ptr
1b880 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e  s from va lists.
1b890 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f  .      ** http:/
1b8a0 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f  /support.microso
1b8b0 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a  ft.com/kb/47961.
1b8c0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
1b8d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
1b8e0 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
1b8f0 61 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69  arg(ap, int(*)(i
1b900 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  nt));.      */. 
1b910 20 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74       typedef int
1b920 28 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55  (*TESTCALLBACKFU
1b930 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20  NC_t)(int);.    
1b940 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1b950 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62  onfig.xTestCallb
1b960 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ack = va_arg(ap,
1b970 20 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e   TESTCALLBACKFUN
1b980 43 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  C_t);.      rc =
1b990 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1b9a0 28 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (0);.      break
1b9b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1b9c0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1b9d0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
1b9e0 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
1b9f0 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
1ba00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
1ba10 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
1ba20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
1ba30 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
1ba40 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
1ba50 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
1ba60 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ba70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
1ba80 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
1ba90 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
1baa0 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
1bab0 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
1bac0 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
1bad0 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
1bae0 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
1baf0 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
1bb00 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
1bb10 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
1bb20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
1bb30 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
1bb40 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
1bb50 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
1bb60 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
1bb70 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
1bb80 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
1bb90 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
1bba0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1bbb0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1bbc0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1bbd0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1bbe0 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
1bbf0 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
1bc00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1bc10 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1bc20 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
1bc30 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
1bc40 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
1bc50 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
1bc60 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
1bc70 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1bc80 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
1bc90 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
1bca0 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
1bcb0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1bcc0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1bcd0 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
1bce0 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
1bcf0 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
1bd00 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
1bd10 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
1bd20 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
1bd30 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
1bd40 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
1bd50 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
1bd60 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
1bd70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1bd80 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
1bd90 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
1bda0 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69  .    ** deleteri
1bdb0 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
1bdc0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1bdd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
1bde0 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
1bdf0 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47      rc = PENDING
1be00 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53  _BYTE;.#ifndef S
1be10 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
1be20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
1be30 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56  nsigned int newV
1be40 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
1be50 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
1be60 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61         if( newVa
1be70 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69  l ) sqlite3Pendi
1be80 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b  ngByte = newVal;
1be90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1bea0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1beb0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1bec0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1bed0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1bee0 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
1bef0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
1bf00 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
1bf10 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
1bf20 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
1bf30 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
1bf40 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
1bf50 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
1bf60 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
1bf70 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
1bf80 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
1bf90 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
1bfa0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1bfb0 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
1bfc0 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
1bfd0 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
1bfe0 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
1bff0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1c000 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
1c010 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
1c020 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
1c030 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1c040 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
1c050 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
1c060 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
1c070 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
1c080 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
1c090 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
1c0a0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
1c0b0 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
1c0c0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c0d0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1c0e0 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
1c0f0 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
1c100 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c110 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  (x = va_arg(ap,i
1c120 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  nt))!=0 );.     
1c130 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62   rc = x;.      b
1c140 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
1c150 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1c160 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1c170 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1c180 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29  L_ALWAYS, int X)
1c190 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1c1a0 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
1c1b0 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
1c1c0 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74  est to see how t
1c1d0 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20  he ALWAYS and.  
1c1e0 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f    ** NEVER macro
1c1f0 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61  s were defined a
1c200 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a  t compile-time..
1c210 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1c220 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1c230 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20  s ALWAYS(X).  . 
1c240 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1c250 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73   recommended tes
1c260 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74  t is X==2.  If t
1c270 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1c280 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 2, that means
1c290 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29  .    ** ALWAYS()
1c2a0 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
1c2b0 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73   both no-op pass
1c2c0 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c  -through macros,
1c2d0 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20   which is the.  
1c2e0 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74    ** default set
1c2f0 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65  ting.  If the re
1c300 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c  turn value is 1,
1c310 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69   then ALWAYS() i
1c320 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  s either.    ** 
1c330 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
1c340 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73  ue or else it as
1c350 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67  serts if its arg
1c360 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a  ument is false..
1c370 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
1c380 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d   behavior (hard-
1c390 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69  coded to true) i
1c3a0 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
1c3b0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
1c3c0 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
1c3d0 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
1c3e0 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20  is disabled and 
1c3f0 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
1c400 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65  * behavior (asse
1c410 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  rt if the argume
1c420 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69  nt to ALWAYS() i
1c430 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20  s false) is the 
1c440 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
1c450 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1c460 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
1c470 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
1c480 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  bled..    **.   
1c490 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65   ** The run-time
1c4a0 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20   test procedure 
1c4b0 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74  might look somet
1c4c0 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
1c4d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1c4e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
1c4f0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1c500 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1c510 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a  , 2)==2 ){.    *
1c520 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
1c530 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
1c540 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  re no-op pass-th
1c550 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20  rough macros.   
1c560 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   **    }else if(
1c570 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c580 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1c590 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29  TCTRL_ASSERT, 1)
1c5a0 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   ){.    **      
1c5b0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73  // ALWAYS(x) ass
1c5c0 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74  erts that x is t
1c5d0 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73  rue. NEVER(x) as
1c5e0 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65  serts x is false
1c5f0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  ..    **    }els
1c600 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  e{.    **      /
1c610 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61  / ALWAYS(x) is a
1c620 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45   constant 1.  NE
1c630 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73  VER(x) is a cons
1c640 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20  tant 0..    **  
1c650 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63    }.    */.    c
1c660 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c670 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20  TRL_ALWAYS: {.  
1c680 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
1c690 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1c6a0 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29    rc = ALWAYS(x)
1c6b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c6c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1c6d0 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   **   sqlite3_te
1c6e0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1c6f0 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
1c700 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  RDER);.    **.  
1c710 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72    ** The integer
1c720 20 72 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c   returned reveal
1c730 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72  s the byte-order
1c740 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72   of the computer
1c750 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a   on which.    **
1c760 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69   SQLite is runni
1c770 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ng:.    **.    *
1c780 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 62 69  *       1     bi
1c790 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74  g-endian,    det
1c7a0 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
1c7b0 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ime.    **      
1c7c0 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e  10     little-en
1c7d0 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64  dian, determined
1c7e0 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20   at run-time.   
1c7f0 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20 20   **  432101     
1c800 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64  big-endian,    d
1c810 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d  etermined at com
1c820 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a  pile-time.    **
1c830 20 20 31 32 33 34 31 30 20 20 20 20 20 6c 69 74    123410     lit
1c840 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65  tle-endian, dete
1c850 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  rmined at compil
1c860 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20  e-time.    */ . 
1c870 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1c880 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45  ESTCTRL_BYTEORDE
1c890 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  R: {.      rc = 
1c8a0 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52  SQLITE_BYTEORDER
1c8b0 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49  *100 + SQLITE_LI
1c8c0 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20  TTLEENDIAN*10 + 
1c8d0 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e  SQLITE_BIGENDIAN
1c8e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c8f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1c900 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1c910 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1c920 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c  TRL_RESERVE, sql
1c930 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
1c940 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1c950 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  et the nReserve 
1c960 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68  size to N for th
1c970 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1c980 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1c990 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f      ** connectio
1c9a0 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  n db..    */.   
1c9b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1c9c0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b  TCTRL_RESERVE: {
1c9d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1c9e0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1c9f0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1ca00 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
1ca10 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  ap,int);.      s
1ca20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1ca30 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1ca40 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1ca50 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d  eSetPageSize(db-
1ca60 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20  >aDb[0].pBt, 0, 
1ca70 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  x, 0);.      sql
1ca80 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1ca90 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1caa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cab0 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
1cac0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1cad0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
1cae0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c  TIMIZATIONS, sql
1caf0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
1cb00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1cb10 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
1cb20 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
1cb30 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69  ations for testi
1cb40 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
1cb50 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  e .    ** argume
1cb60 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73  nt N is a bitmas
1cb70 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f  k of optimizatio
1cb80 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ns to be disable
1cb90 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20  d.  For normal. 
1cba0 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20     ** operation 
1cbb0 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20  N should be 0.  
1cbc0 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
1cbd0 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20   a test program 
1cbe0 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a  (like the.    **
1cbf0 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20   SQL Logic Test 
1cc00 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75  or SLT test modu
1cc10 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20  le) can run the 
1cc20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c  same SQL multipl
1cc30 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77  e times.    ** w
1cc40 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ith various opti
1cc50 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c  mizations disabl
1cc60 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
1cc70 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  t the same answe
1cc80 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61  r.    ** is obta
1cc90 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61  ined in every ca
1cca0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  se..    */.    c
1ccb0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1ccc0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
1ccd0 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
1cce0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1ccf0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1cd00 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c       db->dbOptFl
1cd10 61 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61  ags = (u16)(va_a
1cd20 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78  rg(ap, int) & 0x
1cd30 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65  ffff);.      bre
1cd40 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ak;.    }..#ifde
1cd50 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
1cd60 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  RD.    /* sqlite
1cd70 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1cd80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1cd90 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20  SKEYWORD, const 
1cda0 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20  char *zWord).   
1cdb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57   **.    ** If zW
1cdc0 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64  ord is a keyword
1cdd0 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74   recognized by t
1cde0 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20  he parser, then 
1cdf0 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a  return the.    *
1ce00 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77  * number of keyw
1ce10 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f  ords.  Or if zWo
1ce20 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77  rd is not a keyw
1ce30 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ord, return 0.. 
1ce40 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68     ** .    ** Th
1ce50 69 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20  is test feature 
1ce60 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
1ce70 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d  e in the amalgam
1ce80 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20  ation since.    
1ce90 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f  ** the SQLITE_N_
1cea0 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73  KEYWORD macro is
1ceb0 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20   not defined in 
1cec0 74 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c  this file if SQL
1ced0 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75  ite.    ** is bu
1cee0 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61  ilt using separa
1cef0 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e  te source files.
1cf00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1cf10 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1cf20 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20  _ISKEYWORD: {.  
1cf30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1cf40 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61  zWord = va_arg(a
1cf50 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
1cf60 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
1cf70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1cf80 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20  Word);.      rc 
1cf90 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  = (sqlite3Keywor
1cfa0 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64  dCode((u8*)zWord
1cfb0 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53  , n)!=TK_ID) ? S
1cfc0 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
1cfd0 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  : 0;.      break
1cfe0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a  ;.    }.#endif .
1cff0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1d000 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1d010 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
1d020 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20  ATCHMALLOC, sz, 
1d030 26 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20  &pNew, pFree);. 
1d040 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73     **.    ** Pas
1d050 73 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c  s pFree into sql
1d060 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
1d070 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a  ). .    ** If sz
1d080 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  >0 then allocate
1d090 20 61 20 73 63 72 61 74 63 68 20 62 75 66 66 65   a scratch buffe
1d0a0 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20  r into pNew.  . 
1d0b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1d0c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
1d0d0 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a  CRATCHMALLOC: {.
1d0e0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65        void *pFre
1d0f0 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20  e, **ppNew;.    
1d100 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20    int sz;.      
1d110 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
1d120 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65  int);.      ppNe
1d130 77 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  w = va_arg(ap, v
1d140 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46  oid**);.      pF
1d150 72 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ree = va_arg(ap,
1d160 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69   void*);.      i
1d170 66 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d  f( sz ) *ppNew =
1d180 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
1d190 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20  alloc(sz);.     
1d1a0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
1d1b0 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20  ree(pFree);.    
1d1c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d1d0 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1d1e0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1d1f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
1d200 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69  CALTIME_FAULT, i
1d210 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a  nt onoff);.    *
1d220 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61  *.    ** If para
1d230 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e  meter onoff is n
1d240 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75  on-zero, configu
1d250 72 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20  re the wrappers 
1d260 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20  so that all.    
1d270 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ** subsequent ca
1d280 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65  lls to localtime
1d290 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20  () and variants 
1d2a0 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69  fail. If onoff i
1d2b0 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75  s zero,.    ** u
1d2c0 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67  ndo this setting
1d2d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1d2e0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d2f0 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
1d300 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1d310 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1d320 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d  LocaltimeFault =
1d330 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1d340 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d350 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1d360 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d370 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d380 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
1d390 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a  T, int);.    **.
1d3a0 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c      ** Set or cl
1d3b0 65 61 72 20 61 20 66 6c 61 67 20 74 68 61 74 20  ear a flag that 
1d3c0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1d3d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d3e0 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d   is always well-
1d3f0 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61  .    ** formed a
1d400 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74  nd never corrupt
1d410 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20  .  This flag is 
1d420 63 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c 74  clear by default
1d430 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
1d440 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  t.    ** databas
1d450 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61  e files might ha
1d460 76 65 20 61 72 62 69 74 72 61 72 79 20 63 6f 72  ve arbitrary cor
1d470 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e  ruption.  Settin
1d480 67 20 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e  g the flag durin
1d490 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67  g.    ** testing
1d4a0 20 63 61 75 73 65 73 20 63 65 72 74 61 69 6e 20   causes certain 
1d4b0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1d4c0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20  nts in the code 
1d4d0 74 6f 20 62 65 20 61 63 74 69 76 61 74 65 64 0a  to be activated.
1d4e0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f      ** that demo
1d4f0 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74  nstrat invariant
1d500 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  s on well-formed
1d510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
1d520 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d530 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d540 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20  _NEVER_CORRUPT: 
1d550 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1d560 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65  lobalConfig.neve
1d570 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72  rCorrupt = va_ar
1d580 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1d590 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d5a0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1d5b0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1d5c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56  QLITE_TESTCTRL_V
1d5d0 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43  DBE_COVERAGE, xC
1d5e0 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20  allback, ptr);. 
1d5f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1d600 20 74 68 65 20 56 44 42 45 20 63 6f 76 65 72 61   the VDBE covera
1d610 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  ge callback func
1d620 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63  tion to xCallbac
1d630 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a  k with context .
1d640 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70      ** pointer p
1d650 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  tr..    */.    c
1d660 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1d670 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  TRL_VDBE_COVERAG
1d680 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  E: {.#ifdef SQLI
1d690 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
1d6a0 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
1d6b0 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c  oid (*branch_cal
1d6c0 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
1d6d0 2c 75 38 2c 75 38 29 3b 0a 20 20 20 20 20 20 73  ,u8,u8);.      s
1d6e0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1d6f0 69 67 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d  ig.xVdbeBranch =
1d700 20 76 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63   va_arg(ap,branc
1d710 68 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  h_callback);.   
1d720 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1d730 43 6f 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e  Config.pVdbeBran
1d740 63 68 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  chArg = va_arg(a
1d750 70 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66  p,void*);.#endif
1d760 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d770 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1d780 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d790 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d7a0 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20  RL_SORTER_MMAP, 
1d7b0 64 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20  db, nMax); */.  
1d7c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1d7d0 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d  STCTRL_SORTER_MM
1d7e0 41 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AP: {.      sqli
1d7f0 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1d800 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1d810 20 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f        db->nMaxSo
1d820 72 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72  rterMmap = va_ar
1d830 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1d840 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d850 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1d860 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1d870 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
1d880 49 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  INIT);.    **.  
1d890 20 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49    ** Return SQLI
1d8a0 54 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20  TE_OK if SQLite 
1d8b0 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  has been initial
1d8c0 69 7a 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  ized and SQLITE_
1d8d0 45 52 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20  ERROR if.    ** 
1d8e0 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
1d8f0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1d900 43 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20  CTRL_ISINIT: {. 
1d910 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1d920 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1d930 6e 69 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  nit==0 ) rc = SQ
1d940 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1d950 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d960 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f      /*  sqlite3_
1d970 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1d980 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
1d990 4f 53 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d  OSTER, db, dbNam
1d9a0 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b  e, onOff, tnum);
1d9b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d9c0 68 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c  his test control
1d9d0 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61   is used to crea
1d9e0 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  te imposter tabl
1d9f0 65 73 2e 20 20 22 64 62 22 20 69 73 20 61 20 70  es.  "db" is a p
1da00 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f  ointer.    ** to
1da10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1da20 6e 6e 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d  nnection.  dbNam
1da30 65 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  e is the databas
1da40 65 20 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69  e name (ex: "mai
1da50 6e 22 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65  n" or.    ** "te
1da60 6d 70 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20  mp") which will 
1da70 72 65 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f  receive the impo
1da80 73 74 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74  ster.  "onOff" t
1da90 75 72 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f  urns imposter mo
1daa0 64 65 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20  de on.    ** or 
1dab0 6f 66 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20  off.  "tnum" is 
1dac0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1dad0 20 74 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77   the b-tree to w
1dae0 68 69 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65  hich the imposte
1daf0 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73  r.    ** table s
1db00 68 6f 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20  hould connect.. 
1db10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61     **.    ** Ena
1db20 62 6c 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  ble imposter mod
1db30 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20  e only when the 
1db40 73 63 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61  schema has alrea
1db50 64 79 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20  dy been parsed. 
1db60 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e   Then.    ** run
1db70 20 61 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45   a single CREATE
1db80 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1db90 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68   to construct th
1dba0 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
1dbb0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   in.    ** the p
1dbc0 61 72 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54  arsed schema.  T
1dbd0 68 65 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65  hen turn imposte
1dbe0 72 20 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20  r mode back off 
1dbf0 61 67 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20  again..    **.  
1dc00 20 20 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30    ** If onOff==0
1dc10 20 61 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e   and tnum>0 then
1dc20 20 72 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   reset the schem
1dc30 61 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  a for all databa
1dc40 73 65 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20  ses, causing.   
1dc50 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74   ** the schema t
1dc60 6f 20 62 65 20 72 65 70 61 72 73 65 64 20 74 68  o be reparsed th
1dc70 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
1dc80 73 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20  s needed.  This 
1dc90 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  has the.    ** e
1dca0 66 66 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67  ffect of erasing
1dcb0 20 61 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61   all imposter ta
1dcc0 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bles..    */.   
1dcd0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1dce0 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20  TCTRL_IMPOSTER: 
1dcf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
1dd00 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
1dd10 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
1dd20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1dd30 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1dd40 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74  ;.      db->init
1dd50 2e 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69  .iDb = sqlite3Fi
1dd60 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f  ndDbName(db, va_
1dd70 61 72 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61  arg(ap,const cha
1dd80 72 2a 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  r*));.      db->
1dd90 69 6e 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e  init.busy = db->
1dda0 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62  init.imposterTab
1ddb0 6c 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  le = va_arg(ap,i
1ddc0 6e 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  nt);.      db->i
1ddd0 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61  nit.newTnum = va
1dde0 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
1ddf0 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
1de00 2e 62 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e  .busy==0 && db->
1de10 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29  init.newTnum>0 )
1de20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1de30 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
1de40 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29  OfConnection(db)
1de50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1de60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1de70 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1de80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1de90 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
1dea0 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ap);.#endif /* S
1deb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54  QLITE_OMIT_BUILT
1dec0 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74  IN_TEST */.  ret
1ded0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dee0 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
1def0 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66  ty routine, usef
1df00 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d  ul to VFS implem
1df10 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20  entations, that 
1df20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65  checks.** to see
1df30 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
1df40 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68  ile was a URI th
1df50 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73  at contained a s
1df60 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a  pecific query .*
1df70 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64  * parameter, and
1df80 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74   if so obtains t
1df90 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1dfa0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1dfb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
1dfc0 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
1dfd0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f   the filename po
1dfe0 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74  inter passed int
1dff0 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a  o the xOpen().**
1e000 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53   method of a VFS
1e010 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
1e020 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67    The zParam arg
1e030 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
1e040 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72  e of the.** quer
1e050 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73  y parameter we s
1e060 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eek.  This routi
1e070 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  ne returns the v
1e080 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72  alue of the zPar
1e090 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  am.** parameter 
1e0a0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49  if it exists.  I
1e0b0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
1e0c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
1e0d0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1e0e0 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70  returns a NULL p
1e0f0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74  ointer..*/.const
1e100 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75   char *sqlite3_u
1e110 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e  ri_parameter(con
1e120 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1e130 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1e140 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a  zParam){.  if( z
1e150 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
1e160 50 61 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72  Param==0 ) retur
1e170 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  n 0;.  zFilename
1e180 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
1e190 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
1e1a0 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69   1;.  while( zFi
1e1b0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
1e1c0 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28   int x = strcmp(
1e1d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1e1e0 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  m);.    zFilenam
1e1f0 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
1e200 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
1e210 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d  + 1;.    if( x==
1e220 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  0 ) return zFile
1e230 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  name;.    zFilen
1e240 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
1e250 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
1e260 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  ) + 1;.  }.  ret
1e270 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1e280 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e  Return a boolean
1e290 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
1e2a0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
1e2b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69  .int sqlite3_uri
1e2c0 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63  _boolean(const c
1e2d0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1e2e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
1e2f0 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a  am, int bDflt){.
1e300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1e310 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
1e320 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
1e330 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44  e, zParam);.  bD
1e340 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a  flt = bDflt!=0;.
1e350 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c    return z ? sql
1e360 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
1e370 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74  , bDflt) : bDflt
1e380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1e390 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  n a 64-bit integ
1e3a0 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71  er value for a q
1e3b0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
1e3c0 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1e3d0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74   sqlite3_uri_int
1e3e0 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  64(.  const char
1e3f0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
1e400 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70  /* Filename as p
1e410 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a  assed to xOpen *
1e420 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1e430 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a  zParam,       /*
1e440 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20 73   URI parameter s
1e450 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ought */.  sqlit
1e460 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20  e3_int64 bDflt  
1e470 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69       /* return i
1e480 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d  f parameter is m
1e490 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63  issing */.){.  c
1e4a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1e4b0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1e4c0 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
1e4d0 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74  zParam);.  sqlit
1e4e0 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66  e3_int64 v;.  if
1e4f0 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65  ( z && sqlite3De
1e500 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
1e510 76 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  v)==SQLITE_OK ){
1e520 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a  .    bDflt = v;.
1e530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66    }.  return bDf
1e540 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  lt;.}../*.** Ret
1e550 75 72 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f  urn the Btree po
1e560 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65 64  inter identified
1e570 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65   by zDbName.  Re
1e580 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1e590 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65   found..*/.Btree
1e5a0 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54   *sqlite3DbNameT
1e5b0 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a  oBtree(sqlite3 *
1e5c0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1e5d0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  zDbName){.  int 
1e5e0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1e5f0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1e600 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
1e610 5d 2e 70 42 74 0a 20 20 20 20 20 26 26 20 28 7a  ].pBt.     && (z
1e620 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c  DbName==0 || sql
1e630 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e  ite3StrICmp(zDbN
1e640 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ame, db->aDb[i].
1e650 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29  zName)==0).    )
1e660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 64  {.      return d
1e670 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
1e680 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e690 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
1e6a0 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d  turn the filenam
1e6b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e6c0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
1e6d0 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  h a database.** 
1e6e0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  connection..*/.c
1e6f0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1e700 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73  e3_db_filename(s
1e710 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1e720 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
1e730 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  {.  Btree *pBt;.
1e740 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1e750 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1e760 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1e770 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1e780 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
1e790 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1e7a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e7b0 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d  }.#endif.  pBt =
1e7c0 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
1e7d0 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
1e7e0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  e);.  return pBt
1e7f0 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   ? sqlite3BtreeG
1e800 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20  etFilename(pBt) 
1e810 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  : 0;.}../*.** Re
1e820 74 75 72 6e 20 31 20 69 66 20 64 61 74 61 62 61  turn 1 if databa
1e830 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20  se is read-only 
1e840 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77 72 69  or 0 if read/wri
1e850 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  te.  Return -1 i
1e860 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74  f.** no such dat
1e870 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f  abase exists..*/
1e880 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
1e890 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33  readonly(sqlite3
1e8a0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1e8b0 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74   *zDbName){.  Bt
1e8c0 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66  ree *pBt;.#ifdef
1e8d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1e8e0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1e8f0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1e900 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1e910 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
1e920 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
1e930 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e  turn -1;.  }.#en
1e940 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69  dif.  pBt = sqli
1e950 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1e960 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1e970 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1e980 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64  lite3BtreeIsRead
1e990 6f 6e 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a  only(pBt) : -1;.
1e9a0 7d 0a                                            }.