/ Hex Artifact Content
Login

Artifact 65a1633e4a02139614b3ba13ce5d7e11c7b468336f1203283af438fcc8c488e6:


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 53   SQLITE_ENABLE_S
0290: 51 4c 52 52 0a 23 20 69 6e 63 6c 75 64 65 20 22  QLRR.# include "
02a0: 73 71 6c 72 72 2e 68 22 0a 23 65 6e 64 69 66 20  sqlrr.h".#endif 
02b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
02c0: 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e 63  NABLE_FTS3.# inc
02d0: 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23 65  lude "fts3.h".#e
02e0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02f0: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
0300: 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65 65  # include "rtree
0310: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0320: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0330: 49 43 55 0a 23 20 69 6e 63 6c 75 64 65 20 22 73  ICU.# include "s
0340: 71 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e 64  qliteicu.h".#end
0350: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
0360: 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 69 6e  _ENABLE_JSON1.in
0370: 74 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e  t sqlite3Json1In
0380: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0390: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 56 54  TE_ENABLE_STMTVT
03b0: 41 42 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 74  AB.int sqlite3St
03c0: 6d 74 56 74 61 62 49 6e 69 74 28 73 71 6c 69 74  mtVtabInit(sqlit
03d0: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
03e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03f0: 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69 74  E_FTS5.int sqlit
0400: 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69 74  e3Fts5Init(sqlit
0410: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  e3*);.#endif..#i
0420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  fndef SQLITE_AMA
0430: 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50  LGAMATION./* IMP
0440: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0450: 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68  R-46656-45156 Th
0460: 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  e sqlite3_versio
0470: 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  n[] string const
0480: 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ant.** contains 
0490: 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49  the text of SQLI
04a0: 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f  TE_VERSION macro
04b0: 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  . .*/.const char
04c0: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
04d0: 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53  [] = SQLITE_VERS
04e0: 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  ION;.#endif../* 
04f0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
0500: 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35  F: R-53536-42575
0510: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62   The sqlite3_lib
0520: 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69  version() functi
0530: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20  on returns.** a 
0540: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
0550: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65  o the sqlite3_ve
0560: 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63  rsion[] string c
0570: 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e  onstant. .*/.con
0580: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0590: 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64  _libversion(void
05a0: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
05b0: 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a  3_version; }../*
05c0: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
05d0: 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30  OF: R-63124-3930
05e0: 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f  0 The sqlite3_so
05f0: 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f  urceid() functio
0600: 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70  n returns a.** p
0610: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
0620: 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73  ng constant whos
0630: 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  e value is the s
0640: 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51  ame as the.** SQ
0650: 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43  LITE_SOURCE_ID C
0660: 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61   preprocessor ma
0670: 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63  cro. .*/.const c
0680: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75  har *sqlite3_sou
0690: 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74  rceid(void){ ret
06a0: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43  urn SQLITE_SOURC
06b0: 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c  E_ID; }../* IMPL
06c0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
06d0: 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65  -35210-63508 The
06e0: 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
06f0: 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  ion_number() fun
0700: 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73  ction.** returns
0710: 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61   an integer equa
0720: 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53  l to SQLITE_VERS
0730: 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69  ION_NUMBER..*/.i
0740: 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  nt sqlite3_libve
0750: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69  rsion_number(voi
0760: 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d){ return SQLIT
0770: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
0780: 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  ; }../* IMPLEMEN
0790: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37  TATION-OF: R-207
07a0: 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c  90-14025 The sql
07b0: 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28  ite3_threadsafe(
07c0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
07d0: 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e  ns.** zero if an
07e0: 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65  d only if SQLite
07f0: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69   was compiled wi
0800: 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65  th mutexing code
0810: 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a   omitted due to.
0820: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48  ** the SQLITE_TH
0830: 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65  READSAFE compile
0840: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69  -time option bei
0850: 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  ng set to 0..*/.
0860: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65  int sqlite3_thre
0870: 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65  adsafe(void){ re
0880: 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45  turn SQLITE_THRE
0890: 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a 2a  ADSAFE; }../*.**
08a0: 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   When compiling 
08b0: 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65  the test fixture
08c0: 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67 69   or with debuggi
08d0: 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20 57  ng enabled (on W
08e0: 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20 76  in32),.** this v
08f0: 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73 65  ariable being se
0900: 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69  t to non-zero wi
0910: 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43 45  ll cause OSTRACE
0920: 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74 0a   macros to emit.
0930: 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f 73  ** extra diagnos
0940: 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  tic information.
0950: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0960: 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 0a  E_HAVE_OS_TRACE.
0970: 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  # ifndef SQLITE_
0980: 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a 23  DEBUG_OS_TRACE.#
0990: 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
09a0: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 20  _DEBUG_OS_TRACE 
09b0: 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74 20  0.# endif.  int 
09c0: 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20 3d  sqlite3OSTrace =
09d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53   SQLITE_DEBUG_OS
09e0: 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a 0a  _TRACE;.#endif..
09f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
0a00: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
0a10: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
0a20: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
0a30: 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  )./*.** If the f
0a40: 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
0a50: 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74  n pointer is not
0a60: 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a 20   NULL and if.** 
0a70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0a80: 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65 64  TRACE is enabled
0a90: 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73 20  , then messages 
0aa0: 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49 2f  describing.** I/
0ab0: 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72 69  O active are wri
0ac0: 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73 20  tten using this 
0ad0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73 65  function.  These
0ae0: 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72 65   messages.** are
0af0: 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64 65   intended for de
0b00: 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74 79  bugging activity
0b10: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54 45   only..*/.SQLITE
0b20: 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49 54  _API void (SQLIT
0b30: 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33  E_CDECL *sqlite3
0b40: 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63  IoTrace)(const c
0b50: 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a  har*, ...) = 0;.
0b60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** 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 74 65 6d 70 6f 72 61 72 79 20 66 69  .** temporary fi
0c00: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  les..**.** See a
0c10: 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20  lso the "PRAGMA 
0c20: 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
0c30: 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e  tory" SQL comman
0c40: 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  d..*/.char *sqli
0c50: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
0c60: 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ry = 0;../*.** I
0c70: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0c80: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0c90: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0ca0: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0cb0: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0cc0: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0cd0: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0ce0: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0cf0: 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61 73  e.** all databas
0d00: 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69 65  e files specifie
0d10: 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  d with a relativ
0d20: 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a 2a  e pathname..**.*
0d30: 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22  * See also the "
0d40: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
0d50: 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c  e_directory" SQL
0d60: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61   command..*/.cha
0d70: 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  r *sqlite3_data_
0d80: 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a  directory = 0;..
0d90: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
0da0: 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a 2a   SQLite.  .**.**
0db0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
0dc0: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  st be called to 
0dd0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
0de0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0df0: 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d 75  ,.** VFS, and mu
0e00: 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20 70  tex subsystems p
0e10: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e  rior to doing an
0e20: 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20 77  y serious work w
0e30: 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20  ith.** SQLite.  
0e40: 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 79  But as long as y
0e50: 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69 6c  ou do not compil
0e60: 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d  e with SQLITE_OM
0e70: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20 74  IT_AUTOINIT.** t
0e80: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
0e90: 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f 6d   be called autom
0ea0: 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79 20  atically by key 
0eb0: 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61 73  routines such as
0ec0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
0ed0: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
0ee0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
0ef0: 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69 74  -op except on it
0f00: 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61 6c  s very first cal
0f10: 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65 73  l for the proces
0f20: 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68 65  s,.** or for the
0f30: 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74 65   first call afte
0f40: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
0f50: 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a  te3_shutdown..**
0f60: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 68  .** The first th
0f70: 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68 69  read to call thi
0f80: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74  s routine runs t
0f90: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
0fa0: 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69  n to.** completi
0fb0: 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75 65  on.  If subseque
0fc0: 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c 20  nt threads call 
0fd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 66  this routine bef
0fe0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ore the first.**
0ff0: 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e 69   thread has fini
1000: 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61 6c  shed the initial
1010: 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2c  ization process,
1020: 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65 71   then the subseq
1030: 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73 20  uent.** threads 
1040: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
1050: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
1060: 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68 20  d finishes with 
1070: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1080: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  on..**.** The fi
1090: 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68 74  rst thread might
10a0: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
10b0: 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ne recursively. 
10c0: 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   Recursive.** ca
10d0: 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  lls to this rout
10e0: 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ine should not b
10f0: 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65 2e  lock, of course.
1100: 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 0a    Otherwise the.
1110: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ** initializatio
1120: 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64 20  n process would 
1130: 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e 0a  never complete..
1140: 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20 74  **.** Let X be t
1150: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1160: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  to enter this ro
1170: 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62 65  utine.  Let Y be
1180: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 74   some other.** t
1190: 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68 69  hread.  Then whi
11a0: 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20 69  le the initial i
11b0: 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 69  nvocation of thi
11c0: 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20 69  s routine by X i
11d0: 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65 2c  s.** incomplete,
11e0: 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64 20   it is required 
11f0: 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  that:.**.**    *
1200: 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73 20    Calls to this 
1210: 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20 6d  routine from Y m
1220: 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20  ust block until 
1230: 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a 2a  the outer-most.*
1240: 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79 20  *       call by 
1250: 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a 0a  X completes..**.
1260: 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73 69  **    *  Recursi
1270: 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ve calls to this
1280: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68   routine from th
1290: 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69 6d  read X return im
12a0: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20  mediately.**    
12b0: 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b     without block
12c0: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
12d0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 76  te3_initialize(v
12e0: 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c 4f  oid){.  MUTEX_LO
12f0: 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
1300: 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 20  ex *pMaster; )  
1310: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
1320: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
1330: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1370: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1380: 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e 74  EXTRA_INIT.  int
1390: 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d   bRunExtraInit =
13a0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
13c0: 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ra initializatio
13d0: 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e 64  n needed */.#end
13e0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
13f0: 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63 20  E_OMIT_WSD.  rc 
1400: 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69 6e  = sqlite3_wsd_in
1410: 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20 20  it(4096, 24);.  
1420: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1430: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1440: 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
1450: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c    /* If the foll
1460: 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 66  owing assert() f
1470: 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62 73  ails on some obs
1480: 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f 63  cure processor/c
1490: 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f 6d  ompiler.  ** com
14a0: 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77 6f  bination, the wo
14b0: 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f 20  rk-around is to 
14c0: 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  set the correct 
14d0: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69 7a  pointer.  ** siz
14e0: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
14f0: 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  e using -DSQLITE
1500: 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70 69  _PTRSIZE=n compi
1510: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 2a  le-time option *
1520: 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  /.  assert( SQLI
1530: 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a 65  TE_PTRSIZE==size
1540: 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20 20  of(char*) );..  
1550: 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  /* If SQLite is 
1560: 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74 65  already complete
1570: 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ly initialized, 
1580: 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a 20  then this call. 
1590: 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 69   ** to sqlite3_i
15a0: 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f 75  nitialize() shou
15b0: 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20  ld be a no-op.  
15c0: 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c 69  But the initiali
15d0: 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74  zation.  ** must
15e0: 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20 53   be complete.  S
15f0: 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e 6f  o isInit must no
1600: 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20 74  t be set until t
1610: 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a 2a  he very end.  **
1620: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
1640: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1650: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
1660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1670: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1680: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20  mutex subsystem 
1690: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  is initialized. 
16a0: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a 20   If unable to . 
16b0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
16c0: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
16d0: 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  em, return early
16e0: 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 2e   with the error.
16f0: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79 73  .  ** If the sys
1700: 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20 74  tem is so sick t
1710: 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62 6c  hat we are unabl
1720: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  e to allocate a 
1730: 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65 72  mutex,.  ** ther
1740: 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53 51  e is not much SQ
1750: 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74 6f  Lite is going to
1760: 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e 0a   be able to do..
1770: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 75    **.  ** The mu
1780: 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d 75  tex subsystem mu
1790: 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  st take care of 
17a0: 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73 20  serializing its 
17b0: 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  own.  ** initial
17c0: 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  ization..  */.  
17d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  rc = sqlite3Mute
17e0: 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20 72  xInit();.  if( r
17f0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
1800: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1810: 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79 73  the malloc() sys
1820: 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63 75  tem and the recu
1830: 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65 78  rsive pInitMutex
1840: 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68 69   mutex..  ** Thi
1850: 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  s operation is p
1860: 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20  rotected by the 
1870: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d 75  STATIC_MASTER mu
1880: 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  tex.  Note that.
1890: 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63 28    ** MutexAlloc(
18a0: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
18b0: 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 70  a static mutex p
18c0: 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  rior to initiali
18d0: 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d 61  zing the.  ** ma
18e0: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2d  lloc subsystem -
18f0: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   this implies th
1900: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
1910: 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20 20  n of a static.  
1920: 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e 6f  ** mutex must no
1930: 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f 72  t require suppor
1940: 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f  t from the mallo
1950: 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a  c subsystem..  *
1960: 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  /.  MUTEX_LOGIC(
1970: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
1980: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
1990: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
19a0: 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
19b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19c0: 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71  r(pMaster);.  sq
19d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19e0: 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20  g.isMutexInit = 
19f0: 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  1;.  if( !sqlite
1a00: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1a10: 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20  MallocInit ){.  
1a20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 61    rc = sqlite3Ma
1a30: 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d 0a  llocInit();.  }.
1a40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1a60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1a70: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31 3b  sMallocInit = 1;
1a80: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
1a90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1aa0: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
1ab0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1ac0: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1ad0: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73 71   =.           sq
1ae0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
1af0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
1b00: 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20 69  URSIVE);.      i
1b10: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1b20: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
1b30: 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c 6f  x && !sqlite3Glo
1b40: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1b50: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
1b60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1b70: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  M_BKPT;.      }.
1b80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1b90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1bb0: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
1bc0: 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20  tMutex++;.  }.  
1bd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1be0: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20  ave(pMaster);.. 
1bf0: 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74   /* If rc is not
1c00: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68   SQLITE_OK at th
1c10: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65  is point, then e
1c20: 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63  ither the malloc
1c30: 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20  .  ** subsystem 
1c40: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69  could not be ini
1c50: 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20  tialized or the 
1c60: 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f  system failed to
1c70: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74   allocate.  ** t
1c80: 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75  he pInitMutex mu
1c90: 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  tex. Return an e
1ca0: 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63  rror in either c
1cb0: 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  ase.  */.  if( r
1cc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1cd0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ce0: 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20   }..  /* Do the 
1cf0: 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74  rest of the init
1d00: 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72  ialization under
1d10: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d   the recursive m
1d20: 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61  utex so.  ** tha
1d30: 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c  t we will be abl
1d40: 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75  e to handle recu
1d50: 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f  rsive calls into
1d60: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e  .  ** sqlite3_in
1d70: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65  itialize().  The
1d80: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1d90: 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74   normally come t
1da0: 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69  hrough.  ** sqli
1db0: 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68  te3_os_init() wh
1dc0: 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71  en it invokes sq
1dd0: 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1de0: 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a  er(), but other.
1df0: 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63    ** recursive c
1e00: 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20  alls might also 
1e10: 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  be possible..  *
1e20: 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
1e30: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34  ATION-OF: R-0014
1e40: 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61  0-37445 SQLite a
1e50: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72  utomatically ser
1e60: 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20  ializes calls.  
1e70: 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20  ** to the xInit 
1e80: 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78  method, so the x
1e90: 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64  Init method need
1ea0: 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61   not be threadsa
1eb0: 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  fe..  **.  ** Th
1ec0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65  e following mute
1ed0: 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c  x is what serial
1ee0: 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74  izes access to t
1ef0: 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65  he appdef pcache
1f00: 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68   xInit.  ** meth
1f10: 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ods.  The sqlite
1f20: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
1f30: 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20  .xInit() all is 
1f40: 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a  embedded in the.
1f50: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
1f60: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
1f70: 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  lize()..  */.  s
1f80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1f90: 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  er(sqlite3Global
1fa0: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1fb0: 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  x);.  if( sqlite
1fc0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1fd0: 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74  Init==0 && sqlit
1fe0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1ff0: 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a  nProgress==0 ){.
2000: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2010: 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65  lConfig.inProgre
2020: 73 73 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  ss = 1;.#ifdef S
2030: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
2040: 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  LOG.    {.      
2050: 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
2060: 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67 28  te3_init_sqllog(
2070: 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  void);.      sql
2080: 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67  ite3_init_sqllog
2090: 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ();.    }.#endif
20a0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c  .    memset(&sql
20b0: 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63 74  ite3BuiltinFunct
20c0: 69 6f 6e 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ions, 0, sizeof(
20d0: 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75  sqlite3BuiltinFu
20e0: 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73  nctions));.    s
20f0: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75  qlite3RegisterBu
2100: 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 29  iltinFunctions()
2110: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2120: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2130: 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b  PCacheInit==0 ){
2140: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2150: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
2160: 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ize();.    }.   
2170: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2180: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2190: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
21a0: 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31  isPCacheInit = 1
21b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
21c0: 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20  ite3OsInit();.  
21d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
21e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21f0: 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65     sqlite3PCache
2200: 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71 6c  BufferSetup( sql
2210: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2220: 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20  .pPage, .       
2230: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2240: 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73  Config.szPage, s
2250: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2260: 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  ig.nPage);.     
2270: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2280: 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b  nfig.isInit = 1;
2290: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
22a0: 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20 20 20  XTRA_INIT.      
22b0: 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d 20  bRunExtraInit = 
22c0: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  1;.#endif.    }.
22d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
22e0: 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65  lConfig.inProgre
22f0: 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ss = 0;.  }.  sq
2300: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2310: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
2320: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2330: 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b  );..  /* Go back
2340: 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74 69   under the stati
2350: 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61  c mutex and clea
2360: 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73 69  n up the recursi
2370: 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f  ve.  ** mutex to
2380: 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75   prevent a resou
2390: 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20  rce leak..  */. 
23a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
23b0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
23c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
23d0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
23e0: 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69  ex--;.  if( sqli
23f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2400: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30  nRefInitMutex<=0
2410: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2420: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2430: 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65  fig.nRefInitMute
2440: 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
2450: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73  te3_mutex_free(s
2460: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2470: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
2480: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2490: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
24a0: 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ex = 0;.  }.  sq
24b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
24c0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
24d0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24e0: 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79  is just a sanity
24f0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
2500: 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20  ure SQLite has. 
2510: 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65   ** been compile
2520: 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74  d correctly.  It
2530: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
2540: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20   run this code, 
2550: 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  but.  ** we don'
2560: 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74  t want to run it
2570: 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73   too often and s
2580: 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65  oak up CPU cycle
2590: 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65  s for no.  ** re
25a0: 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e  ason.  So we run
25b0: 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20   it once during 
25c0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
25d0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
25e0: 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  BUG.#ifndef SQLI
25f0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
2600: 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73  _POINT.  /* This
2610: 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65   section of code
2620: 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22  's only "output"
2630: 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28 29   is via assert()
2640: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a   statements. */.
2650: 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54    if ( rc==SQLIT
2660: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20  E_OK ){.    u64 
2670: 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36  x = (((u64)1)<<6
2680: 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65  3)-1;.    double
2690: 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73   y;.    assert(s
26a0: 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20  izeof(x)==8);.  
26b0: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
26c0: 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a  x)==sizeof(y));.
26d0: 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26      memcpy(&y, &
26e0: 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72  x, 8);.    asser
26f0: 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  t( sqlite3IsNaN(
2700: 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  y) );.  }.#endif
2710: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
2720: 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   extra initializ
2730: 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75  ation steps requ
2740: 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51 4c  ested by the SQL
2750: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
2760: 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   ** compile-time
2770: 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69   option..  */.#i
2780: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
2790: 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52 75  A_INIT.  if( bRu
27a0: 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20 20  nExtraInit ){.  
27b0: 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54    int SQLITE_EXT
27c0: 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68  RA_INIT(const ch
27d0: 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ar*);.    rc = S
27e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
27f0: 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (0);.  }.#endif.
2800: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2810: 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20  ./*.** Undo the 
2820: 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74  effects of sqlit
2830: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
2840: 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61    Must not be ca
2850: 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68  lled while.** th
2860: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
2870: 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ing database con
2880: 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f  nections or memo
2890: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f  ry allocations o
28a0: 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70  r.** while any p
28b0: 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73  art of SQLite is
28c0: 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
28d0: 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e  e in any thread.
28e0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
28f0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
2900: 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73 20  afe.  But it is 
2910: 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74  safe to invoke t
2920: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f  his routine.** o
2930: 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73  n when SQLite is
2940: 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f   already shut do
2950: 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69  wn.  If SQLite i
2960: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
2970: 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  own.** when this
2980: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
2990: 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ked, then this r
29a0: 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d  outine is a harm
29b0: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  less no-op..*/.i
29c0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  nt sqlite3_shutd
29d0: 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64 65  own(void){.#ifde
29e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
29f0: 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  D.  int rc = sql
2a00: 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30  ite3_wsd_init(40
2a10: 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72  96, 24);.  if( r
2a20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a30: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2a50: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2a60: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23  nfig.isInit ){.#
2a70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2a80: 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20  RA_SHUTDOWN.    
2a90: 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52  void SQLITE_EXTR
2aa0: 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29  A_SHUTDOWN(void)
2ab0: 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54  ;.    SQLITE_EXT
2ac0: 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23  RA_SHUTDOWN();.#
2ad0: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
2ae0: 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20  3_os_end();.    
2af0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75  sqlite3_reset_au
2b00: 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a  to_extension();.
2b10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b20: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d  lConfig.isInit =
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 50 43 61 63 68 65 49 6e 69 74 20 29  g.isPCacheInit )
2b60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
2b70: 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20  cheShutdown();. 
2b80: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2b90: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
2ba0: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  nit = 0;.  }.  i
2bb0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2bc0: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
2bd0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2be0: 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20  e3MallocEnd();. 
2bf0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2c00: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
2c10: 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  nit = 0;..#ifnde
2c20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2c30: 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49  UTDOWN_DIRECTORI
2c40: 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65  ES.    /* The he
2c50: 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61 73  ap subsystem has
2c60: 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f   now been shutdo
2c70: 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c  wn and these val
2c80: 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 64  ues are supposed
2c90: 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55  .    ** to be NU
2ca0: 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d  LL or point to m
2cb0: 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f  emory that was o
2cc0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2cd0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20  ite3_malloc(),. 
2ce0: 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c     ** which woul
2cf0: 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68  d rely on that h
2d00: 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74  eap subsystem; t
2d10: 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73  herefore, make s
2d20: 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a  ure these.    **
2d30: 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72   values cannot r
2d40: 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d  efer to heap mem
2d50: 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75 73  ory that was jus
2d60: 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68  t invalidated wh
2d70: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65  en the.    ** he
2d80: 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61 73  ap subsystem was
2d90: 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73   shutdown.  This
2da0: 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66   is only done if
2db0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c   the current cal
2dc0: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73  l to.    ** this
2dd0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74   function result
2de0: 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20 73  ed in the heap s
2df0: 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c  ubsystem actuall
2e00: 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e  y being shutdown
2e10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
2e20: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
2e30: 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ory = 0;.    sql
2e40: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
2e50: 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ory = 0;.#endif.
2e60: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
2e70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2e80: 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20  MutexInit ){.   
2e90: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64   sqlite3MutexEnd
2ea0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2eb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2ec0: 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  texInit = 0;.  }
2ed0: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2ee0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2ef0: 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61  his API allows a
2f00: 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d  pplications to m
2f10: 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c  odify the global
2f20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
2f30: 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20  f.** the SQLite 
2f40: 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74  library at run-t
2f50: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ime..**.** This 
2f60: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
2f70: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
2f80: 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
2f90: 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64  outstanding.** d
2fa0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2fb0: 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c  ons or memory al
2fc0: 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  locations.  This
2fd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a   routine is not.
2fe0: 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ** threadsafe.  
2ff0: 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20  Failure to heed 
3000: 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63  these warnings c
3010: 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65  an lead to unpre
3020: 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61  dictable.** beha
3030: 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
3040: 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20  ite3_config(int 
3050: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
3060: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
3070: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
3080: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66   /* sqlite3_conf
3090: 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72  ig() shall retur
30a0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  n SQLITE_MISUSE 
30b0: 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  if it is invoked
30c0: 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20   while.  ** the 
30d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69  SQLite library i
30e0: 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69  s in use. */.  i
30f0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3100: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20  Config.isInit ) 
3110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
3120: 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61  SUSE_BKPT;..  va
3130: 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
3140: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
3150: 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f  .    /* Mutex co
3160: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
3170: 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61  ons are only ava
3180: 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65  ilable in a thre
3190: 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f  adsafe.    ** co
31a0: 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  mpile..    */.#i
31b0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
31c0: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
31d0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
31e0: 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  E>0  /* IMP: R-5
31f0: 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20 20  4466-46756 */.  
3200: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3210: 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41  NFIG_SINGLETHREA
3220: 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  D: {.      /* EV
3230: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 37  IDENCE-OF: R-027
3240: 34 38 2d 31 39 30 39 36 20 54 68 69 73 20 6f 70  48-19096 This op
3250: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68  tion sets the th
3260: 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a  reading mode to.
3270: 20 20 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65 2d        ** Single-
3280: 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20  thread. */.     
3290: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32a0: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
32b0: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
32c0: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a   mutex on core *
32d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
32e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
32f0: 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20  lMutex = 0;  /* 
3300: 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e  Disable mutex on
3310: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
3320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3330: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
3340: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
3350: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
3360: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
3370: 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32 30 2d  /* IMP: R-20520-
3380: 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63 61 73  54086 */.    cas
3390: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
33a0: 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20  MULTITHREAD: {. 
33b0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
33c0: 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d 34 32 34  -OF: R-14374-424
33d0: 36 38 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  68 This option s
33e0: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
33f0: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3400: 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64 2e  ** Multi-thread.
3410: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3420: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
3430: 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f  oreMutex = 1;  /
3440: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f  * Enable mutex o
3450: 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  n core */.      
3460: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3470: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
3480: 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20   0;  /* Disable 
3490: 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74  mutex on connect
34a0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  ions */.      br
34b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
34c0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
34d0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29  LITE_THREADSAFE)
34e0: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
34f0: 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20  DSAFE>0 /* IMP: 
3500: 52 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a 2f  R-59593-21810 */
3510: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3520: 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a  _CONFIG_SERIALIZ
3530: 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ED: {.      /* E
3540: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31  VIDENCE-OF: R-41
3550: 32 32 30 2d 35 31 38 30 30 20 54 68 69 73 20 6f  220-51800 This o
3560: 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74  ption sets the t
3570: 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f  hreading mode to
3580: 0a 20 20 20 20 20 20 2a 2a 20 53 65 72 69 61 6c  .      ** Serial
3590: 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ized. */.      s
35a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
35b0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
35c0: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
35d0: 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20  tex on core */. 
35e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
35f0: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
3600: 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61  tex = 1;  /* Ena
3610: 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e  ble mutex on con
3620: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  nections */.    
3630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
3640: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
3650: 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  d(SQLITE_THREADS
3660: 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  AFE) && SQLITE_T
3670: 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49  HREADSAFE>0 /* I
3680: 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34 38 37 35  MP: R-63666-4875
3690: 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  5 */.    case SQ
36a0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45  LITE_CONFIG_MUTE
36b0: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70  X: {.      /* Sp
36c0: 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61  ecify an alterna
36d0: 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65  tive mutex imple
36e0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
36f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3700: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a  Config.mutex = *
3710: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3720: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
3730: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
3740: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
3750: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3760: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
3770: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3780: 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 34  E>0 /* IMP: R-14
3790: 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20 20  450-37597 */.   
37a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
37b0: 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a  FIG_GETMUTEX: {.
37c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
37d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75  e the current mu
37e0: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
37f0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f  on */.      *va_
3800: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3810: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20  mutex_methods*) 
3820: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3830: 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20  onfig.mutex;.   
3840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3850: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
3860: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3870: 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f  ALLOC: {.      /
3880: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3890: 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68 65  -55594-21030 The
38a0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
38b0: 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b  ALLOC option tak
38c0: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
38d0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
38e0: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
38f0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
3900: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
3910: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3920: 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20 54  ods structure. T
3930: 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63  he argument spec
3940: 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69 76  ifies alternativ
3950: 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d 6c  e.      ** low-l
3960: 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  evel memory allo
3970: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3980: 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  to be used in pl
3990: 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72  ace of the memor
39a0: 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63  y.      ** alloc
39b0: 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 62  ation routines b
39c0: 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65  uilt into SQLite
39d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
39e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
39f0: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
3a00: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3a10: 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ds*);.      brea
3a20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3a30: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3a40: 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  GETMALLOC: {.   
3a50: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3a60: 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31 34  F: R-51213-46414
3a70: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
3a80: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70 74  IG_GETMALLOC opt
3a90: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
3aa0: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
3ab0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
3ac0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
3ad0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20  stance of the.  
3ae0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d      ** sqlite3_m
3af0: 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63  em_methods struc
3b00: 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74 65  ture. The sqlite
3b10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3b20: 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20 20  ructure is.     
3b30: 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
3b40: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
3b50: 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c 6c  fined memory all
3b60: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3b70: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
3b80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3b90: 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20  ig.m.xMalloc==0 
3ba0: 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44  ) sqlite3MemSetD
3bb0: 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20  efault();.      
3bc0: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3bd0: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a  te3_mem_methods*
3be0: 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ) = sqlite3Globa
3bf0: 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20  lConfig.m;.     
3c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3c10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3c20: 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20  NFIG_MEMSTATUS: 
3c30: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3c40: 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35 2d  NCE-OF: R-61275-
3c50: 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54 45  35157 The SQLITE
3c60: 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55  _CONFIG_MEMSTATU
3c70: 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  S option takes. 
3c80: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
3c90: 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20  rgument of type 
3ca0: 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65 64  int, interpreted
3cb0: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20 77   as a boolean, w
3cc0: 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20 20  hich enables.   
3cd0: 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c 65     ** or disable
3ce0: 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  s the collection
3cf0: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   of memory alloc
3d00: 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73  ation statistics
3d10: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3d20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3d30: 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67  Memstat = va_arg
3d40: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3d60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3d70: 4e 46 49 47 5f 53 4d 41 4c 4c 5f 4d 41 4c 4c 4f  NFIG_SMALL_MALLO
3d80: 43 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  C: {.      sqlit
3d90: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3da0: 53 6d 61 6c 6c 4d 61 6c 6c 6f 63 20 3d 20 76 61  SmallMalloc = va
3db0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3dc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3dd0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3de0: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
3df0: 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  HE: {.      /* E
3e00: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
3e10: 37 36 31 2d 33 36 36 30 31 20 54 68 65 72 65 20  761-36601 There 
3e20: 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65  are three argume
3e30: 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
3e40: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41  SQLITE_CONFIG_PA
3e50: 47 45 43 41 43 48 45 3a 20 41 20 70 6f 69 6e 74  GECACHE: A point
3e60: 65 72 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69  er to 8-byte ali
3e70: 67 6e 65 64 20 6d 65 6d 6f 72 79 20 28 70 4d 65  gned memory (pMe
3e80: 6d 29 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  m),.      ** the
3e90: 20 73 69 7a 65 20 6f 66 20 65 61 63 68 20 70 61   size of each pa
3ea0: 67 65 20 63 61 63 68 65 20 6c 69 6e 65 20 28 73  ge cache line (s
3eb0: 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  z), and the numb
3ec0: 65 72 20 6f 66 20 63 61 63 68 65 20 6c 69 6e 65  er of cache line
3ed0: 73 0a 20 20 20 20 20 20 2a 2a 20 28 4e 29 2e 20  s.      ** (N). 
3ee0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3ef0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
3f00: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
3f10: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3f20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3f30: 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72  g.szPage = va_ar
3f40: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3f50: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3f60: 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61  onfig.nPage = va
3f70: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3f90: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3fa0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
3fb0: 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20 2f  HDRSZ: {.      /
3fc0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3fd0: 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68 65  -39100-27317 The
3fe0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3ff0: 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74 69  CACHE_HDRSZ opti
4000: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
4010: 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61 6d  * a single param
4020: 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61 20  eter which is a 
4030: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
4040: 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65 73  teger and writes
4050: 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
4060: 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65 20  hat integer the 
4070: 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  number of extra 
4080: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 72  bytes per page r
4090: 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
40a0: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
40b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
40c0: 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20 20  PAGECACHE. */.  
40d0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
40e0: 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20 20  int*) = .       
40f0: 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72     sqlite3Header
4100: 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20 20  SizeBtree() +.  
4110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4120: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 28  eaderSizePcache(
4130: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
4140: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4150: 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20 20  cache1();.      
4160: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4180: 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20  NFIG_PCACHE: {. 
4190: 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
41a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
41b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
41c0: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43  ITE_CONFIG_GETPC
41d0: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
41e0: 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f   now an error */
41f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4200: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
4210: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4220: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4230: 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a  NFIG_PCACHE2: {.
4240: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
4250: 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34 38  E-OF: R-63325-48
4260: 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f 43  378 The SQLITE_C
4270: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f 70  ONFIG_PCACHE2 op
4280: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
4290: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
42a0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
42b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
42c0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
42d0: 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20  thods2.      ** 
42e0: 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62 6a  object. This obj
42f0: 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74 68  ect specifies th
4300: 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61  e interface to a
4310: 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61 63   custom page cac
4320: 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
4330: 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ementation. */. 
4340: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4350: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
4360: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
4370: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
4380: 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20  thods2*);.      
4390: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
43a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
43b0: 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20  FIG_GETPCACHE2: 
43c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
43d0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35 2d  NCE-OF: R-22035-
43e0: 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54 45  46182 The SQLITE
43f0: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
4400: 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  E2 option takes 
4410: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
4420: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
4430: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4440: 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63   an sqlite3_pcac
4450: 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20  he_methods2.    
4460: 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51 4c    ** object. SQL
4470: 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ite copies of th
4480: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
4490: 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ache implementat
44a0: 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  ion into.      *
44b0: 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20 2a  * that object. *
44c0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
44d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
44e0: 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30  pcache2.xInit==0
44f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4500: 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61  te3PCacheSetDefa
4510: 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ult();.      }. 
4520: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
4530: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
4540: 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c  methods2*) = sql
4550: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4560: 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20  .pcache2;.      
4570: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f 2a  break;.    }../*
4580: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4590: 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65 20  06626-12911 The 
45a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
45b0: 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 6c  AP option is onl
45c0: 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69  y.** available i
45d0: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
45e0: 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65 72  iled with either
45f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
4600: 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51 4c  EMSYS3 or.** SQL
4610: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4620: 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53  S5 and returns S
4630: 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 69  QLITE_ERROR if i
4640: 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73 65  nvoked otherwise
4650: 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  . */.#if defined
4660: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
4670: 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e  EMSYS3) || defin
4680: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
4690: 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61  _MEMSYS5).    ca
46a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
46b0: 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f  _HEAP: {.      /
46c0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
46d0: 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68 65  -19854-42126 The
46e0: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
46f0: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
4700: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
4710: 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74 65  _HEAP: An 8-byte
4720: 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65 72   aligned pointer
4730: 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   to the memory, 
4740: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d  the.      ** num
4750: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4760: 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66 65  the memory buffe
4770: 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d  r, and the minim
4780: 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  um allocation si
4790: 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
47a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
47b0: 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76  Config.pHeap = v
47c0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
47d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
47e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
47f0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
4800: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
4810: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4820: 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70  nReq = va_arg(ap
4830: 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69  , int);..      i
4840: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4850: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29  Config.mnReq<1 )
4860: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4870: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
4880: 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Req = 1;.      }
4890: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
48a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
48b0: 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20  eq>(1<<12) ){.  
48c0: 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e        /* cap min
48d0: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61 74   request size at
48e0: 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20   2^12 */.       
48f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4900: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c  nfig.mnReq = (1<
4910: 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  <12);.      }.. 
4920: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4930: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
4940: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
4950: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
4960: 20 52 2d 34 39 39 32 30 2d 36 30 31 38 39 20 49   R-49920-60189 I
4970: 66 20 74 68 65 20 66 69 72 73 74 20 70 6f 69 6e  f the first poin
4980: 74 65 72 20 28 74 68 65 20 6d 65 6d 6f 72 79 20  ter (the memory 
4990: 70 6f 69 6e 74 65 72 29 0a 20 20 20 20 20 20 20  pointer).       
49a0: 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65   ** is NULL, the
49b0: 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72 74 73  n SQLite reverts
49c0: 20 74 6f 20 75 73 69 6e 67 20 69 74 73 20 64 65   to using its de
49d0: 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c 6c  fault memory all
49e0: 6f 63 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a  ocator.        *
49f0: 2a 20 28 74 68 65 20 73 79 73 74 65 6d 20 6d 61  * (the system ma
4a00: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
4a10: 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67 20  ation), undoing 
4a20: 61 6e 79 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  any prior invoca
4a30: 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 20 20  tion of.        
4a40: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
4a50: 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20 20 20 20  _MALLOC..       
4a60: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 53   **.        ** S
4a70: 65 74 74 69 6e 67 20 73 71 6c 69 74 65 33 47 6c  etting sqlite3Gl
4a80: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f 20  obalConfig.m to 
4a90: 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c 6c 20 63  all zeros will c
4aa0: 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a 20  ause malloc to. 
4ab0: 20 20 20 20 20 20 20 2a 2a 20 72 65 76 65 72 74         ** revert
4ac0: 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20   to its default 
4ad0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
4ae0: 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  hen sqlite3_init
4af0: 69 61 6c 69 7a 65 28 29 20 69 73 20 72 75 6e 0a  ialize() is run.
4b00: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
4b10: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
4b20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4b30: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
4b40: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4b50: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
4b60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
4b70: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 30 30  DENCE-OF: R-6100
4b80: 36 2d 30 38 39 31 38 20 49 66 20 74 68 65 20 6d  6-08918 If the m
4b90: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 69 73  emory pointer is
4ba0: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 74   not NULL then t
4bb0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
4bc0: 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72 79  ternative memory
4bd0: 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6e   allocator is en
4be0: 67 61 67 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  gaged to handle 
4bf0: 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65 73 0a 20  all of SQLites. 
4c00: 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79         ** memory
4c10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65 64   allocation need
4c20: 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s. */.#ifdef SQL
4c30: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4c40: 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S3.        sqlit
4c50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4c60: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
4c70: 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64  tMemsys3();.#end
4c80: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4c90: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a  _ENABLE_MEMSYS5.
4ca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
4cb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
4cc0: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65  *sqlite3MemGetMe
4cd0: 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a  msys5();.#endif.
4ce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4cf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4d00: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
4d10: 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  TE_CONFIG_LOOKAS
4d20: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  IDE: {.      sql
4d30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4d40: 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76  .szLookaside = v
4d50: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4d70: 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
4d80: 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70  side = va_arg(ap
4d90: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
4da0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  eak;.    }.    .
4db0: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61 20      /* Record a 
4dc0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  pointer to the l
4dd0: 6f 67 67 65 72 20 66 75 6e 63 74 69 6f 6e 20 61  ogger function a
4de0: 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72 67  nd its first arg
4df0: 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ument..    ** Th
4e00: 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55 4c  e default is NUL
4e10: 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20 64  L.  Logging is d
4e20: 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20 66  isabled if the f
4e30: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
4e40: 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a  is.    ** NULL..
4e50: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4e60: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
4e70: 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53  G: {.      /* MS
4e80: 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75  VC is picky abou
4e90: 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70  t pulling func p
4ea0: 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74  trs from va list
4eb0: 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70  s..      ** http
4ec0: 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f  ://support.micro
4ed0: 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36  soft.com/kb/4796
4ee0: 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  1.      ** sqlit
4ef0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
4f00: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
4f10: 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69   void(*)(void*,i
4f20: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  nt,const char*))
4f30: 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
4f40: 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a 4c   typedef void(*L
4f50: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
4f60: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
4f70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4f80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
4f90: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f   = va_arg(ap, LO
4fa0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4fb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4fc0: 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61  fig.pLogArg = va
4fd0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
4fe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ff0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44    }..    /* EVID
5000: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 34 38  ENCE-OF: R-55548
5010: 2d 33 33 38 31 37 20 54 68 65 20 63 6f 6d 70 69  -33817 The compi
5020: 6c 65 2d 74 69 6d 65 20 73 65 74 74 69 6e 67 20  le-time setting 
5030: 66 6f 72 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  for URI filename
5040: 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20  s.    ** can be 
5050: 63 68 61 6e 67 65 64 20 61 74 20 73 74 61 72 74  changed at start
5060: 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68 65 0a  -time using the.
5070: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
5080: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
5090: 46 49 47 5f 55 52 49 2c 31 29 20 6f 72 0a 20 20  FIG_URI,1) or.  
50a0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    ** sqlite3_con
50b0: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
50c0: 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66 69 67 75  G_URI,0) configu
50d0: 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20 20  ration calls..  
50e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
50f0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a  LITE_CONFIG_URI:
5100: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5110: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34 35 31  ENCE-OF: R-25451
5120: 2d 36 31 31 32 35 20 54 68 65 20 53 51 4c 49 54  -61125 The SQLIT
5130: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70 74  E_CONFIG_URI opt
5140: 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67  ion takes a sing
5150: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  le.      ** argu
5160: 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e 74  ment of type int
5170: 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  . If non-zero, t
5180: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
5190: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
51a0: 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
51b0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
51c0: 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  is zero, then UR
51d0: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
51e0: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
51f0: 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20  disabled. */.   
5200: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5210: 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 20  Config.bOpenUri 
5220: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5230: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5240: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
5250: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f  SQLITE_CONFIG_CO
5260: 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41  VERING_INDEX_SCA
5270: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  N: {.      /* EV
5280: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 35  IDENCE-OF: R-365
5290: 39 32 2d 30 32 37 37 32 20 54 68 65 20 53 51 4c  92-02772 The SQL
52a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
52b0: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 0a 20  ING_INDEX_SCAN. 
52c0: 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 74       ** option t
52d0: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  akes a single in
52e0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20 77  teger argument w
52f0: 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
5300: 74 65 64 20 61 73 20 61 0a 20 20 20 20 20 20 2a  ted as a.      *
5310: 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72 64  * boolean in ord
5320: 65 72 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20  er to enable or 
5330: 64 69 73 61 62 6c 65 20 74 68 65 20 75 73 65 20  disable the use 
5340: 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 69  of covering indi
5350: 63 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ces for.      **
5360: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
5370: 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 6f  s in the query o
5380: 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20 20  ptimizer. */.   
5390: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
53a0: 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 20 3d  Config.bUseCis =
53b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
53c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
53d0: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
53e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
53f0: 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  G.    case SQLIT
5400: 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 3a  E_CONFIG_SQLLOG:
5410: 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
5420: 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55 4e   void(*SQLLOGFUN
5430: 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69  C_t)(void*, sqli
5440: 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
5450: 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  *, int);.      s
5460: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5470: 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61 5f  ig.xSqllog = va_
5480: 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46 55  arg(ap, SQLLOGFU
5490: 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  NC_t);.      sql
54a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54b0: 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76 61  .pSqllogArg = va
54c0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20 2a 29  _arg(ap, void *)
54d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
54e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
54f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5500: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  FIG_MMAP_SIZE: {
5510: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
5520: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36 33 2d 33  CE-OF: R-58063-3
5530: 38 32 35 38 20 53 51 4c 49 54 45 5f 43 4f 4e 46  8258 SQLITE_CONF
5540: 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20 74 61 6b  IG_MMAP_SIZE tak
5550: 65 73 20 74 77 6f 20 36 34 2d 62 69 74 0a 20 20  es two 64-bit.  
5560: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 28      ** integer (
5570: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 76  sqlite3_int64) v
5580: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 74  alues that are t
5590: 68 65 20 64 65 66 61 75 6c 74 20 6d 6d 61 70 20  he default mmap 
55a0: 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20 20 20 20  size limit.     
55b0: 20 2a 2a 20 28 74 68 65 20 64 65 66 61 75 6c 74   ** (the default
55c0: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 50 52 41   setting for PRA
55d0: 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 29 20 61  GMA mmap_size) a
55e0: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  nd the maximum a
55f0: 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 2a 2a 20  llowed.      ** 
5600: 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 2e  mmap size limit.
5610: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5620: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
5630: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
5640: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
5650: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
5660: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
5670: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
5680: 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  4);.      /* EVI
5690: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 33 36  DENCE-OF: R-5336
56a0: 37 2d 34 33 31 39 30 20 49 66 20 65 69 74 68 65  7-43190 If eithe
56b0: 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  r argument to th
56c0: 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a 20 20 20  is option is.   
56d0: 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20     ** negative, 
56e0: 74 68 65 6e 20 74 68 61 74 20 61 72 67 75 6d 65  then that argume
56f0: 6e 74 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  nt is changed to
5700: 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   its compile-tim
5710: 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20 20  e default..     
5720: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
5730: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 39  DENCE-OF: R-3499
5740: 33 2d 34 35 30 33 31 20 54 68 65 20 6d 61 78 69  3-45031 The maxi
5750: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d 61 70  mum allowed mmap
5760: 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 0a 20 20   size will be.  
5770: 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79 20      ** silently 
5780: 74 72 75 6e 63 61 74 65 64 20 69 66 20 6e 65 63  truncated if nec
5790: 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20 69  essary so that i
57a0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65 65  t does not excee
57b0: 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  d the.      ** c
57c0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 78 69  ompile-time maxi
57d0: 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 73 65  mum mmap size se
57e0: 74 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  t by the SQLITE_
57f0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20 20  MAX_MMAP_SIZE.  
5800: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74      ** compile-t
5810: 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 20 20  ime option..    
5820: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d    */.      if( m
5830: 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61  xMmap<0 || mxMma
5840: 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  p>SQLITE_MAX_MMA
5850: 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  P_SIZE ){.      
5860: 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54    mxMmap = SQLIT
5870: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b  E_MAX_MMAP_SIZE;
5880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5890: 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73 7a  f( szMmap<0 ) sz
58a0: 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
58b0: 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b  FAULT_MMAP_SIZE;
58c0: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61  .      if( szMma
58d0: 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61 70  p>mxMmap) szMmap
58e0: 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20   = mxMmap;.     
58f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5900: 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78  nfig.mxMmap = mx
5910: 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mmap;.      sqli
5920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5930: 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
5940: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5950: 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
5960: 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65  OS_WIN && define
5970: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
5980: 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20 52  ALLOC) /* IMP: R
5990: 2d 30 34 37 38 30 2d 35 35 38 31 35 20 2a 2f 0a  -04780-55815 */.
59a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
59b0: 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41  CONFIG_WIN32_HEA
59c0: 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f  PSIZE: {.      /
59d0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
59e0: 2d 33 34 39 32 36 2d 30 33 33 36 30 20 53 51 4c  -34926-03360 SQL
59f0: 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32  ITE_CONFIG_WIN32
5a00: 5f 48 45 41 50 53 49 5a 45 20 74 61 6b 65 73 20  _HEAPSIZE takes 
5a10: 61 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  a 32-bit.      *
5a20: 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  * unsigned integ
5a30: 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 73 70  er value that sp
5a40: 65 63 69 66 69 65 73 20 74 68 65 20 6d 61 78 69  ecifies the maxi
5a50: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
5a60: 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  created.      **
5a70: 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20 20   heap. */.      
5a80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5a90: 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61  fig.nHeap = va_a
5aa0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5ac0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
5ad0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
5ae0: 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73 71  MASZ: {.      sq
5af0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5b00: 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72 67  g.szPma = va_arg
5b10: 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
5b20: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
5b40: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
5b50: 54 4d 54 4a 52 4e 4c 5f 53 50 49 4c 4c 3a 20 7b  TMTJRNL_SPILL: {
5b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5b70: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 74 6d 74  obalConfig.nStmt
5b80: 53 70 69 6c 6c 20 3d 20 76 61 5f 61 72 67 28 61  Spill = va_arg(a
5b90: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
5ba0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5bb0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5bc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
5bd0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
5be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
5bf0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
5c00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5c10: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
5c20: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
5c30: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
5c40: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
5c50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
5c60: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
5c70: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
5c80: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
5c90: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
5ca0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
5cb0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
5cc0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
5cd0: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
5ce0: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
5cf0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
5d00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
5d10: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
5d20: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
5d30: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
5d40: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
5d50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5d60: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
5d70: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
5d80: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
5d90: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
5da0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
5db0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
5dc0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
5dd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
5de0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
5df0: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
5e00: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
5e10: 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20 53   cnt){.#ifndef S
5e20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41  QLITE_OMIT_LOOKA
5e30: 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53 74  SIDE.  void *pSt
5e40: 61 72 74 3b 0a 20 20 0a 20 20 69 66 28 20 73 71  art;.  .  if( sq
5e50: 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73  lite3LookasideUs
5e60: 65 64 28 64 62 2c 30 29 3e 30 20 29 7b 0a 20 20  ed(db,0)>0 ){.  
5e70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5e80: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46  BUSY;.  }.  /* F
5e90: 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ree any existing
5ea0: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5eb0: 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c  r for this handl
5ec0: 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c  e before.  ** al
5ed0: 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f  locating a new o
5ee0: 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68  ne so we don't h
5ef0: 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61 63  ave to have spac
5f00: 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68  e for .  ** both
5f10: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5f20: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
5f30: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
5f40: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
5f50: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
5f60: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
5f70: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69  .  }.  /* The si
5f80: 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64  ze of a lookasid
5f90: 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55  e slot after ROU
5fa0: 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f  NDDOWN8 needs to
5fb0: 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20   be larger.  ** 
5fc0: 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  than a pointer t
5fd0: 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a  o be useful..  *
5fe0: 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f  /.  sz = ROUNDDO
5ff0: 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50  WN8(sz);  /* IMP
6000: 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20  : R-33038-09382 
6010: 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e  */.  if( sz<=(in
6020: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
6030: 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20  deSlot*) ) sz = 
6040: 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29  0;.  if( cnt<0 )
6050: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
6060: 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20  sz==0 || cnt==0 
6070: 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  ){.    sz = 0;. 
6080: 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20     pStart = 0;. 
6090: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d   }else if( pBuf=
60a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
60b0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
60c0: 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74  oc();.    pStart
60d0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
60e0: 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20  ( sz*cnt );  /* 
60f0: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
6100: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
6110: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
6120: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
6130: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
6140: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
6150: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
6160: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
6170: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
6180: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6190: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
61a0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 20  lookaside.pInit 
61b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
61c0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
61d0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
61e0: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
61f0: 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
6200: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f    int i;.    Loo
6210: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20  kasideSlot *p;. 
6220: 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20     assert( sz > 
6230: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
6240: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20  asideSlot*) );. 
6250: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6260: 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a 20 20  .nSlot = cnt;.  
6270: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
6280: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
6290: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
62a0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
62b0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
62c0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 3b  lookaside.pInit;
62d0: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
62e0: 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70 3b 0a  side.pInit = p;.
62f0: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
6300: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
6310: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
6320: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6330: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
6340: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
6350: 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  sable = 0;.    d
6360: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6370: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
6380: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
6390: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
63a0: 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20  e.pStart = db;. 
63b0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
63c0: 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20  .pEnd = db;.    
63d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
63e0: 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  isable = 1;.    
63f0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6400: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 20  alloced = 0;.   
6410: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
6420: 53 6c 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  Slot = 0;.  }.#e
6430: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6440: 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f  MIT_LOOKASIDE */
6450: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6460: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6470: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
6480: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
6490: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
64a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
64b0: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
64c0: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
64d0: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
64e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
64f0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
6500: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
6510: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
6520: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
6530: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
6540: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
6550: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74    return db->mut
6560: 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ex;.}../*.** Fre
6570: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
6580: 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66 72  ory as we can fr
6590: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  om the given dat
65a0: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
65b0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
65c0: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
65d0: 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64  emory(sqlite3 *d
65e0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  b){.  int i;..#i
65f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6600: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6610: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6620: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
6630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6640: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
6650: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6660: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
6670: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
6680: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
6690: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
66a0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
66b0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
66c0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
66d0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
66e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
66f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6700: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
6710: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
6720: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
6730: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
6740: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
6750: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6760: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6770: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6780: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6790: 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79 20  Flush any dirty 
67a0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
67b0: 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e 79  er-cache for any
67c0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
67d0: 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  se.** to disk..*
67e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
67f0: 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c 69  _cacheflush(sqli
6800: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
6810: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
6820: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62  LITE_OK;.  int b
6830: 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a 23  SeenBusy = 0;..#
6840: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6850: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
6860: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
6870: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
6880: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6890: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
68a0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
68b0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
68c0: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
68d0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
68e0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
68f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
6900: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6910: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6920: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6930: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
6940: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6950: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
6960: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
6970: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6980: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
6990: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
69a0: 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a 20  Flush(pPager);. 
69b0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
69c0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
69d0: 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d 20      bSeenBusy = 
69e0: 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
69f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
6a00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
6a10: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
6a20: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
6a30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6a40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
6a50: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
6a60: 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73 79  _OK && bSeenBusy
6a70: 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ) ? SQLITE_BUSY 
6a80: 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
6a90: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
6aa0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
6ab0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
6ac0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
6ad0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
6ae0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
6af0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
6b00: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6b10: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
6b20: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
6b30: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
6b40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
6b50: 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45  ONFIG_MAINDBNAME
6b60: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50  : {.      /* IMP
6b70: 3a 20 52 2d 30 36 38 32 34 2d 32 38 35 33 31 20  : R-06824-28531 
6b80: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  */.      /* IMP:
6b90: 20 52 2d 33 36 32 35 37 2d 35 32 31 32 35 20 2a   R-36257-52125 *
6ba0: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  /.      db->aDb[
6bb0: 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 76 61  0].zDbSName = va
6bc0: 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a  _arg(ap,char*);.
6bd0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6be0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  E_OK;.      brea
6bf0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6c00: 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  e SQLITE_DBCONFI
6c10: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
6c20: 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20       void *pBuf 
6c30: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
6c40: 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  d*); /* IMP: R-2
6c50: 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20  6835-10964 */.  
6c60: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
6c70: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6c80: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37      /* IMP: R-47
6c90: 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20  871-25994 */.   
6ca0: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f     int cnt = va_
6cb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6cc0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34     /* IMP: R-044
6cd0: 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20  60-53386 */.    
6ce0: 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b    rc = setupLook
6cf0: 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20  aside(db, pBuf, 
6d00: 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20  sz, cnt);.      
6d10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6d20: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6d30: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
6d40: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20  truct {.        
6d50: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20  int op;      /* 
6d60: 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  The opcode */.  
6d70: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20        u32 mask; 
6d80: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68     /* Mask of th
6d90: 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33  e bit in sqlite3
6da0: 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c  .flags to set/cl
6db0: 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61  ear */.      } a
6dc0: 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  FlagOp[] = {.   
6dd0: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
6de0: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
6df0: 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  EY,           SQ
6e00: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
6e10: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
6e20: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
6e30: 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c  _ENABLE_TRIGGER,
6e40: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
6e50: 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c  nableTrigger  },
6e60: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6e70: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6e80: 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52  E_FTS3_TOKENIZER
6e90: 2c 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b  , SQLITE_Fts3Tok
6ea0: 65 6e 69 7a 65 72 20 20 7d 2c 0a 20 20 20 20 20  enizer  },.     
6eb0: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6ec0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  NFIG_ENABLE_LOAD
6ed0: 5f 45 58 54 45 4e 53 49 4f 4e 2c 20 53 51 4c 49  _EXTENSION, SQLI
6ee0: 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
6ef0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
6f00: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e  QLITE_DBCONFIG_N
6f10: 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 2c  O_CKPT_ON_CLOSE,
6f20: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 6f 43        SQLITE_NoC
6f30: 6b 70 74 4f 6e 43 6c 6f 73 65 20 20 7d 2c 0a 20  kptOnClose  },. 
6f40: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
6f50: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
6f60: 51 50 53 47 2c 20 20 20 20 20 20 20 20 20 20 20  QPSG,           
6f70: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
6f80: 47 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7d  G     },.      }
6f90: 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  ;.      unsigned
6fa0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63   int i;.      rc
6fb0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
6fc0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30   /* IMP: R-42790
6fd0: 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20  -23372 */.      
6fe0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
6ff0: 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69  Size(aFlagOp); i
7000: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
7010: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d   aFlagOp[i].op==
7020: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  op ){.          
7030: 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61  int onoff = va_a
7040: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
7050: 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73         int *pRes
7060: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
7070: 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75  t*);.          u
7080: 33 32 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62  32 oldFlags = db
7090: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  ->flags;.       
70a0: 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29     if( onoff>0 )
70b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  {.            db
70c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67  ->flags |= aFlag
70d0: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
70e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
70f0: 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  onoff==0 ){.    
7100: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
7110: 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d  s &= ~aFlagOp[i]
7120: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
7130: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
7140: 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66   oldFlags!=db->f
7150: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
7160: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
7170: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
7180: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
7190: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
71a0: 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20  f( pRes ){.     
71b0: 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28         *pRes = (
71c0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61  db->flags & aFla
71d0: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b  gOp[i].mask)!=0;
71e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
71f0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
7200: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
7210: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7220: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7230: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
7240: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
7250: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
7260: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
7270: 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  e if the buffer 
7280: 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69  z[0..n-1] contai
7290: 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a  ns all spaces..*
72a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
72b0: 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61  Spaces(const cha
72c0: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
72d0: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b  while( n>0 && z[
72e0: 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d  n-1]==' ' ){ n--
72f0: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d  ; }.  return n==
7300: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
7310: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
7320: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
7330: 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59  on named "BINARY
7340: 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79  " which is alway
7350: 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a  s.** available..
7360: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64  **.** If the pad
7370: 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
7380: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73   not NULL then s
7390: 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20  pace padding at 
73a0: 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74  the end.** of st
73b0: 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64  rings is ignored
73c0: 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e  .  This implemen
73d0: 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c  ts the RTRIM col
73e0: 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lation..*/.stati
73f0: 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e  c int binCollFun
7400: 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c  c(.  void *padFl
7410: 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ag,.  int nKey1,
7420: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
7430: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
7440: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
7450: 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  y2.){.  int rc, 
7460: 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e  n;.  n = nKey1<n
7470: 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e  Key2 ? nKey1 : n
7480: 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45  Key2;.  /* EVIDE
7490: 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d  NCE-OF: R-65033-
74a0: 32 38 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d  28449 The built-
74b0: 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74  in BINARY collat
74c0: 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a  ion compares.  *
74d0: 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65 20 62  * strings byte b
74e0: 79 20 62 79 74 65 20 75 73 69 6e 67 20 74 68 65  y byte using the
74f0: 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69   memcmp() functi
7500: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  on from the stan
7510: 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72  dard C.  ** libr
7520: 61 72 79 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ary. */.  assert
7530: 28 20 70 4b 65 79 31 20 26 26 20 70 4b 65 79 32  ( pKey1 && pKey2
7540: 20 29 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d   );.  rc = memcm
7550: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
7560: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
7570: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
7580: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
7590: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
75a0: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
75b0: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
75c0: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
75d0: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
75e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   ){.      /* EVI
75f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32  DENCE-OF: R-3162
7600: 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20 69 73  4-24737 RTRIM is
7610: 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63   like BINARY exc
7620: 65 70 74 20 74 68 61 74 20 65 78 74 72 61 0a 20  ept that extra. 
7630: 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61       ** spaces a
7640: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74  t the end of eit
7650: 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f  her string do no
7660: 74 20 63 68 61 6e 67 65 20 74 68 65 20 72 65 73  t change the res
7670: 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20  ult. In other.  
7680: 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74      ** words, st
7690: 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61  rings will compa
76a0: 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20  re equal to one 
76b0: 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20  another as long 
76c0: 61 73 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a  as they.      **
76d0: 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20   differ only in 
76e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70  the number of sp
76f0: 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e  aces at the end.
7700: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
7710: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
7720: 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20  nKey1 - nKey2;. 
7730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7740: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
7750: 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20  nother built-in 
7760: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7770: 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a  ce: NOCASE. .**.
7780: 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e  ** This collatin
7790: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e  g sequence is in
77a0: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
77b0: 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65  d for "case inde
77c0: 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61  pendent.** compa
77d0: 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73  rison". SQLite's
77e0: 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70   knowledge of up
77f0: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61  per and lower ca
7800: 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a  se equivalents.*
7810: 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74  * extends only t
7820: 6f 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74  o the 26 charact
7830: 65 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  ers used in the 
7840: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
7850: 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d  ..**.** At the m
7860: 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f  oment there is o
7870: 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c  nly a UTF-8 impl
7880: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ementation..*/.s
7890: 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65  tatic int nocase
78a0: 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20  CollatingFunc(. 
78b0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
78c0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
78d0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
78e0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
78f0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
7900: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69  {.  int r = sqli
7910: 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20  te3StrNICmp(.   
7920: 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a     (const char *
7930: 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63  )pKey1, (const c
7940: 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b  har *)pKey2, (nK
7950: 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31  ey1<nKey2)?nKey1
7960: 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45  :nKey2);.  UNUSE
7970: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
7980: 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72  sed);.  if( 0==r
7990: 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79   ){.    r = nKey
79a0: 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72  1-nKey2;.  }.  r
79b0: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
79c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57  * Return the ROW
79d0: 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ID of the most r
79e0: 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a  ecent insert.*/.
79f0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c  sqlite_int64 sql
7a00: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
7a10: 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  _rowid(sqlite3 *
7a20: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
7a30: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
7a40: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
7a50: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
7a60: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
7a70: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
7a80: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
7a90: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7aa0: 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52  return db->lastR
7ab0: 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  owid;.}../*.** S
7ac0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  et the value ret
7ad0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c  urned by the sql
7ae0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
7af0: 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e  _rowid() API fun
7b00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
7b10: 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61 73 74 5f  qlite3_set_last_
7b20: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c  insert_rowid(sql
7b30: 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65  ite3 *db, sqlite
7b40: 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b  3_int64 iRowid){
7b50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7b60: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
7b70: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7b80: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
7b90: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
7ba0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
7bb0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7bc0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
7bd0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
7be0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
7bf0: 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  lastRowid = iRow
7c00: 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  id;.  sqlite3_mu
7c10: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7c20: 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tex);.}../*.** R
7c30: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
7c40: 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74   of changes in t
7c50: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
7c60: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
7c70: 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xec()..*/.int sq
7c80: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71  lite3_changes(sq
7c90: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
7ca0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
7cb0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
7cc0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
7cd0: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
7ce0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
7cf0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
7d00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
7d10: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
7d20: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  ->nChange;.}../*
7d30: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
7d40: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
7d50: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
7d60: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  ase handle was o
7d70: 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pened..*/.int sq
7d80: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
7d90: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
7da0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
7db0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
7dc0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
7dd0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
7de0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
7df0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
7e00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7e10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
7e20: 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  urn db->nTotalCh
7e30: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ange;.}../*.** C
7e40: 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61  lose all open sa
7e50: 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66  vepoints. This f
7e60: 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e  unction only man
7e70: 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20  ipulates fields 
7e80: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
7e90: 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  se handle object
7ea0: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c  , it does not cl
7eb0: 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e  ose any savepoin
7ec0: 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f  ts that may be o
7ed0: 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d  pen.** at the b-
7ee0: 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c  tree/pager level
7ef0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7f00: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
7f10: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
7f20: 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76   while( db->pSav
7f30: 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61  epoint ){.    Sa
7f40: 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20  vepoint *pTmp = 
7f50: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
7f60: 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69      db->pSavepoi
7f70: 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74  nt = pTmp->pNext
7f80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7f90: 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20  ree(db, pTmp);. 
7fa0: 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f   }.  db->nSavepo
7fb0: 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  int = 0;.  db->n
7fc0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
7fd0: 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
7fe0: 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  onSavepoint = 0;
7ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
8000: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
8010: 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  function associa
8020: 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65 66  ted with FuncDef
8030: 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65   p, if any. Exce
8040: 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  pt,.** if this i
8050: 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63  s not the last c
8060: 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74  opy of the funct
8070: 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f  ion, do not invo
8080: 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a  ke it. Multiple.
8090: 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73  ** copies of a s
80a0: 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61  ingle function a
80b0: 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e 20  re created when 
80c0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
80d0: 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77  ) is called.** w
80e0: 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61  ith SQLITE_ANY a
80f0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a  s the encoding..
8100: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
8110: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73  unctionDestroy(s
8120: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
8130: 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44  Def *p){.  FuncD
8140: 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74  estructor *pDest
8150: 72 75 63 74 6f 72 20 3d 20 70 2d 3e 75 2e 70 44  ructor = p->u.pD
8160: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28  estructor;.  if(
8170: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
8180: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
8190: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
81a0: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
81b0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ef==0 ){.      p
81c0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73  Destructor->xDes
81d0: 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72  troy(pDestructor
81e0: 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20  ->pUserData);.  
81f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8200: 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f  e(db, pDestructo
8210: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
8220: 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63  ./*.** Disconnec
8230: 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74  t all sqlite3_vt
8240: 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ab objects that 
8250: 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61  belong to databa
8260: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
8270: 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c   db. This is cal
8280: 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62  led when db is b
8290: 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  eing closed..*/.
82a0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63  static void disc
82b0: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71  onnectAllVtab(sq
82c0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e  lite3 *db){.#ifn
82d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
82e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
82f0: 6e 74 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d  nt i;.  HashElem
8300: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   *p;.  sqlite3Bt
8310: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
8320: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
8330: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
8340: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
8350: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
8360: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64  chema;.    if( d
8370: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
8380: 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  a ){.      for(p
8390: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
83a0: 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
83b0: 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  sh); p; p=sqlite
83c0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
83d0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
83e0: 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73 71 6c  b = (Table *)sql
83f0: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
8400: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
8410: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 73 71  rtual(pTab) ) sq
8420: 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e  lite3VtabDisconn
8430: 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ect(db, pTab);. 
8440: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8450: 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48  .  for(p=sqliteH
8460: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d  ashFirst(&db->aM
8470: 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c  odule); p; p=sql
8480: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
8490: 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f  .    Module *pMo
84a0: 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71  d = (Module *)sq
84b0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
84c0: 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70  .    if( pMod->p
84d0: 45 70 6f 54 61 62 20 29 7b 0a 20 20 20 20 20 20  EpoTab ){.      
84e0: 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f  sqlite3VtabDisco
84f0: 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e  nnect(db, pMod->
8500: 70 45 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a  pEpoTab);.    }.
8510: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
8520: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
8530: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
8540: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c  eaveAll(db);.#el
8550: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
8560: 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69  METER(db);.#endi
8570: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
8580: 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61  n TRUE if databa
8590: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
85a0: 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64   has unfinalized
85b0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
85c0: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
85d0: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
85e0: 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a  ckup objects.  .
85f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
8600: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73  nnectionIsBusy(s
8610: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
8620: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
8630: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8640: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
8650: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
8660: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
8670: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
8680: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; j++){.    Btr
8690: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
86a0: 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[j].pBt;.    if
86b0: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
86c0: 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28  BtreeIsInBackup(
86d0: 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  pBt) ) return 1;
86e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
86f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
8700: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
8710: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73  te database.*/.s
8720: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8730: 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  3Close(sqlite3 *
8740: 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d  db, int forceZom
8750: 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20  bie){.  if( !db 
8760: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
8770: 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31  CE-OF: R-63257-1
8780: 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c  1740 Calling sql
8790: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a  ite3_close() or.
87a0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
87b0: 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20 61  lose_v2() with a
87c0: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72   NULL pointer ar
87d0: 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d  gument is a harm
87e0: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  less no-op. */. 
87f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8800: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
8810: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
8820: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
8830: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8840: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
8850: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
8860: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
8870: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
8880: 3e 6d 54 72 61 63 65 20 26 20 53 51 4c 49 54 45  >mTrace & SQLITE
8890: 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a  _TRACE_CLOSE ){.
88a0: 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28 53      db->xTrace(S
88b0: 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
88c0: 45 2c 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  E, db->pTraceArg
88d0: 2c 20 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  , db, 0);.  }.. 
88e0: 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f   /* Force xDisco
88f0: 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61  nnect calls on a
8900: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
8910: 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63  s */.  disconnec
8920: 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20  tAllVtab(db);.. 
8930: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
8940: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
8950: 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  e disconnectAllV
8960: 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  tab() call above
8970: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68  .  ** will not h
8980: 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78  ave called the x
8990: 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74  Disconnect() met
89a0: 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75  hod on any virtu
89b0: 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69  al.  ** tables i
89c0: 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e  n the db->aVTran
89d0: 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66  s[] array. The f
89e0: 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
89f0: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20  VtabRollback(). 
8a00: 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f   ** call will do
8a10: 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20   so. We need to 
8a20: 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74  do this before t
8a30: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74  he check for act
8a40: 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ive.  ** SQL sta
8a50: 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61  tements below, a
8a60: 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d  s the v-table im
8a70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
8a80: 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a   be storing.  **
8a90: 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73   some prepared s
8aa0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e  tatements intern
8ab0: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ally..  */.  sql
8ac0: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
8ad0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61  (db);..  /* Lega
8ae0: 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c  cy behavior (sql
8af0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68  ite3_close() beh
8b00: 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74  avior) is to ret
8b10: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
8b20: 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e  BUSY if the conn
8b30: 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62  ection can not b
8b40: 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61  e closed immedia
8b50: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
8b60: 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26   !forceZombie &&
8b70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
8b80: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
8b90: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
8ba0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
8bb0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f  , "unable to clo
8bc0: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
8bd0: 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22  lized ".       "
8be0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
8bf0: 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73  finished backups
8c00: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
8c10: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8c20: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
8c30: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
8c40: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
8c50: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
8c60: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
8c70: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
8c80: 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f  og ){.    /* Clo
8c90: 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e  sing the handle.
8ca0: 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
8cb0: 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  r is passed the 
8cc0: 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20  value 2. */.    
8cd0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
8ce0: 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69  fig.xSqllog(sqli
8cf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
8d00: 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20  pSqllogArg, db, 
8d10: 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 2);.  }.#endi
8d20: 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  f..  /* Convert 
8d30: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
8d40: 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64  nto a zombie and
8d50: 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a   then close it..
8d60: 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63    */.  db->magic
8d70: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
8d80: 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65  ZOMBIE;.  sqlite
8d90: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
8da0: 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20  oseZombie(db);. 
8db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8dc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  K;.}../*.** Two 
8dd0: 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68  variations on th
8de0: 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61  e public interfa
8df0: 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61  ce for closing a
8e00: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
8e10: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c  nection. The sql
8e20: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72  ite3_close() ver
8e30: 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  sion returns SQL
8e40: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
8e50: 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65  leaves the conne
8e60: 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20  ction option if 
8e70: 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61  there are unfina
8e80: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
8e90: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
8ea0: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
8eb0: 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65  e3_backups.  The
8ec0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
8ed0: 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66  2().** version f
8ee0: 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63  orces the connec
8ef0: 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61  tion to become a
8f00: 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65   zombie if there
8f10: 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64   are.** unclosed
8f20: 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20   resources, and 
8f30: 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61  arranges for dea
8f40: 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74  llocation when t
8f50: 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61  he last.** prepa
8f60: 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20  re statement or 
8f70: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63  sqlite3_backup c
8f80: 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  loses..*/.int sq
8f90: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69  lite3_close(sqli
8fa0: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
8fb0: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
8fc0: 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74  ,0); }.int sqlit
8fd0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69  e3_close_v2(sqli
8fe0: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
8ff0: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
9000: 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ,1); }.../*.** C
9010: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f  lose the mutex o
9020: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
9030: 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20  ction db..**.** 
9040: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20  Furthermore, if 
9050: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9060: 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62  ion db is a zomb
9070: 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  ie (meaning that
9080: 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65   there.** has be
9090: 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  en a prior call 
90a0: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  to sqlite3_close
90b0: 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  (db) or sqlite3_
90c0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e  close_v2(db)) an
90d0: 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74  d.** every sqlit
90e0: 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20  e3_stmt has now 
90f0: 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
9100: 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65 33  nd every sqlite3
9110: 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66  _backup has.** f
9120: 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72  inished, then fr
9130: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
9140: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9150: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
9160: 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65  oseZombie(sqlite
9170: 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c  3 *db){.  HashEl
9180: 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20  em *i;          
9190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
91a0: 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72  h table iterator
91b0: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20   */.  int j;..  
91c0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
91d0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69  outstanding sqli
91e0: 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69  te3_stmt or sqli
91f0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
9200: 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  ts.  ** or if th
9210: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
9220: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c   not yet been cl
9230: 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  osed by sqlite3_
9240: 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a  close_v2(),.  **
9250: 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65   then just leave
9260: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72   the mutex and r
9270: 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
9280: 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c  ( db->magic!=SQL
9290: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
92a0: 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   || connectionIs
92b0: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
92c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
92d0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
92e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
92f0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
9300: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
9310: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
9320: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9330: 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f  ion has.  ** clo
9340: 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  sed all sqlite3_
9350: 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33  stmt and sqlite3
9360: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20  _backup objects 
9370: 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  and has been.  *
9380: 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  * passed to sqli
9390: 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69  te3_close (meani
93a0: 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61 20  ng that it is a 
93b0: 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66  zombie).  Theref
93c0: 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65  ore,.  ** go ahe
93d0: 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20  ad and free all 
93e0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a  resources..  */.
93f0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
9400: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
9410: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68  roll it back. Th
9420: 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20  is also ensures 
9430: 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79  that if.  ** any
9440: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
9450: 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  s have been modi
9460: 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d  fied by an uncom
9470: 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
9480: 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65  on.  ** they are
9490: 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74   reset. And that
94a0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62 2d   the required b-
94b0: 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
94c0: 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ld to make.  ** 
94d0: 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61  the pager rollba
94e0: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
94f0: 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70  set an atomic op
9500: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71  eration. */.  sq
9510: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
9520: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
9530: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
9540: 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65  outstanding Save
9550: 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
9560: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c  . */.  sqlite3Cl
9570: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
9580: 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
9590: 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ll database conn
95a0: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  ections */.  for
95b0: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
95c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
95d0: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
95e0: 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  >aDb[j];.    if(
95f0: 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pDb->pBt ){.   
9600: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
9610: 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a  lose(pDb->pBt);.
9620: 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d        pDb->pBt =
9630: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21   0;.      if( j!
9640: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =1 ){.        pD
9650: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a  b->pSchema = 0;.
9660: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9670: 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  }.  /* Clear the
9680: 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70   TEMP schema sep
9690: 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74  arately and last
96a0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44   */.  if( db->aD
96b0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
96c0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
96d0: 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31  aClear(db->aDb[1
96e0: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ].pSchema);.  }.
96f0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
9700: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20  ockList(db);..  
9710: 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20 61  /* Free up the a
9720: 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72  rray of auxiliar
9730: 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  y databases */. 
9740: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
9750: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
9760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
9770: 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73  >nDb<=2 );.  ass
9780: 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62  ert( db->aDb==db
9790: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a  ->aDbStatic );..
97a0: 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f    /* Tell the co
97b0: 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74  de in notify.c t
97c0: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  hat the connecti
97d0: 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c  on no longer hol
97e0: 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ds any.  ** lock
97f0: 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72  s and does not r
9800: 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68  equire any furth
9810: 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  er unlock-notify
9820: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
9830: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  .  sqlite3Connec
9840: 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a  tionClosed(db);.
9850: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
9860: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46  ashFirst(&db->aF
9870: 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  unc); i; i=sqlit
9880: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
9890: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78     FuncDef *pNex
98a0: 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  t, *p;.    p = s
98b0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
98c0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
98d0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
98e0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 4e  db, p);.      pN
98f0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
9900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9910: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ree(db, p);.    
9920: 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20    p = pNext;.   
9930: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
9940: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
9950: 6c 65 61 72 28 26 64 62 2d 3e 61 46 75 6e 63 29  lear(&db->aFunc)
9960: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
9970: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9980: 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73  CollSeq); i; i=s
9990: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
99a0: 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  ){.    CollSeq *
99b0: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
99c0: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
99d0: 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76  a(i);.    /* Inv
99e0: 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63 74  oke any destruct
99f0: 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20 66  ors registered f
9a00: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  or collation seq
9a10: 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e  uence user data.
9a20: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
9a30: 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
9a40: 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78    if( pColl[j].x
9a50: 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Del ){.        p
9a60: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f  Coll[j].xDel(pCo
9a70: 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20  ll[j].pUser);.  
9a80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9a90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9aa0: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , pColl);.  }.  
9ab0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
9ac0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
9ad0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9ae0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9af0: 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  E.  for(i=sqlite
9b00: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9b10: 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71  Module); i; i=sq
9b20: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
9b30: 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d  {.    Module *pM
9b40: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73  od = (Module *)s
9b50: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
9b60: 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e  ;.    if( pMod->
9b70: 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  xDestroy ){.    
9b80: 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79    pMod->xDestroy
9b90: 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20  (pMod->pAux);.  
9ba0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
9bb0: 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c  tabEponymousTabl
9bc0: 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29  eClear(db, pMod)
9bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
9be0: 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ree(db, pMod);. 
9bf0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
9c00: 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75  Clear(&db->aModu
9c10: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  le);.#endif..  s
9c20: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
9c30: 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44  SQLITE_OK); /* D
9c40: 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63  eallocates any c
9c50: 61 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69  ached error stri
9c60: 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ngs. */.  sqlite
9c70: 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70  3ValueFree(db->p
9c80: 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  Err);.  sqlite3C
9c90: 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64  loseExtensions(d
9ca0: 62 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  b);.#if SQLITE_U
9cb0: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
9cc0: 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ON.  sqlite3_fre
9cd0: 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68  e(db->auth.zAuth
9ce0: 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  User);.  sqlite3
9cf0: 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a  _free(db->auth.z
9d00: 41 75 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a  AuthPW);.#endif.
9d10: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
9d20: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
9d30: 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d  R;..  /* The tem
9d40: 70 2d 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  p-database schem
9d50: 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64  a is allocated d
9d60: 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20  ifferently from 
9d70: 74 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61  the other schema
9d80: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75  .  ** objects (u
9d90: 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  sing sqliteMallo
9da0: 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  c() directly, in
9db0: 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33  stead of sqlite3
9dc0: 42 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a  BtreeSchema())..
9dd0: 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73    ** So it needs
9de0: 20 74 6f 20 62 65 20 66 72 65 65 64 20 68 65 72   to be freed her
9df0: 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74  e. Todo: Why not
9e00: 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73   roll the temp s
9e10: 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20  chema into.  ** 
9e20: 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d  the same sqliteM
9e30: 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f  alloc() as the o
9e40: 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65  ne that allocate
9e50: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  s the database .
9e60: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a    ** structure?.
9e70: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
9e80: 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62  Free(db, db->aDb
9e90: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
9ea0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9eb0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9ec0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
9ed0: 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
9ee0: 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  D;.  sqlite3_mut
9ef0: 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65  ex_free(db->mute
9f00: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  x);.  assert( sq
9f10: 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73  lite3LookasideUs
9f20: 65 64 28 64 62 2c 30 29 3d 3d 30 20 29 3b 0a 20  ed(db,0)==0 );. 
9f30: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
9f40: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
9f50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9f60: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
9f70: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 23 69 66 64  Start);.  }.#ifd
9f80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9f90: 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63 43 6c  _SQLRR.  SRRecCl
9fa0: 6f 73 65 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a  ose(db);.#endif.
9fb0: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65    .  sqlite3_fre
9fc0: 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(db);.}../*.** 
9fd0: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74  Rollback all dat
9fe0: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66  abase files.  If
9ff0: 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
a000: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
a010: 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63 75  .** any write cu
a020: 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
a030: 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22  dated ("tripped"
a040: 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69   - as in "trippi
a050: 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20  ng a circuit.** 
a060: 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61  breaker") and ma
a070: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69  de to return tri
a080: 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61  pCode if there a
a090: 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a  re any further.*
a0a0: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73  * attempts to us
a0b0: 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20 20  e that cursor.  
a0c0: 52 65 61 64 20 63 75 72 73 6f 72 73 20 72 65 6d  Read cursors rem
a0d0: 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c  ain open and val
a0e0: 69 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22 73  id.** but are "s
a0f0: 61 76 65 64 22 20 69 6e 20 63 61 73 65 20 74 68  aved" in case th
a100: 65 20 74 61 62 6c 65 20 70 61 67 65 73 20 61 72  e table pages ar
a110: 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a  e moved around..
a120: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
a130: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74  ollbackAll(sqlit
a140: 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70  e3 *db, int trip
a150: 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Code){.  int i;.
a160: 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20    int inTrans = 
a170: 30 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61 43  0;.  int schemaC
a180: 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74 28  hange;.  assert(
a190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a1a0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
a1b0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
a1c0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a1d0: 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c  .  /* Obtain all
a1e0: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20   b-tree mutexes 
a1f0: 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e  before making an
a200: 79 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65  y calls to Btree
a210: 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a  Rollback(). .  *
a220: 2a 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74  * This is import
a230: 61 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20  ant in case the 
a240: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
a250: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61  g rolled back ha
a260: 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20  s.  ** modified 
a270: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
a280: 65 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72  ema. If the b-tr
a290: 65 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e  ee mutexes are n
a2a0: 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65  ot taken.  ** he
a2b0: 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72  re, then another
a2c0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f   shared-cache co
a2d0: 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73  nnection might s
a2e0: 6e 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a  neak in between.
a2f0: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
a300: 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  e rollback and s
a310: 63 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69  chema reset, whi
a320: 63 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c  ch can cause fal
a330: 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69  se.  ** corrupti
a340: 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f  on reports in so
a350: 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20  me cases.  */.  
a360: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
a370: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68 65  rAll(db);.  sche
a380: 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e  maChange = (db->
a390: 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41  mDbFlags & DBFLA
a3a0: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 29 21  G_SchemaChange)!
a3b0: 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 && db->init.b
a3c0: 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69  usy==0;..  for(i
a3d0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
a3e0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
a3f0: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
a400: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  Bt;.    if( p ){
a410: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
a420: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
a430: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  (p) ){.        i
a440: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
a450: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a460: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
a470: 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63 68  , tripCode, !sch
a480: 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  emaChange);.    
a490: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
a4a0: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
a4b0: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
a4c0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
a4d0: 69 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67  if( (db->mDbFlag
a4e0: 73 26 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  s&DBFLAG_SchemaC
a4f0: 68 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62 2d  hange)!=0 && db-
a500: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
a510: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
a520: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
a530: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
a540: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
a550: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
a560: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
a570: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
a580: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
a590: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
a5a0: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
a5b0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
a5c0: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
a5d0: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
a5e0: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
a5f0: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
a600: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
a610: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
a620: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
a630: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
a640: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
a650: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
a660: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
a670: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
a680: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
a690: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
a6a0: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
a6b0: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
a6c0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
a6d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a6e0: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
a6f0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
a700: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
a710: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
a720: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
a730: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
a740: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
a750: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
a760: 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f  EED_ERR_NAME).co
a770: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
a780: 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  3ErrName(int rc)
a790: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
a7a0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
a7b0: 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b   i, origRc = rc;
a7c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20  .  for(i=0; i<2 
a7d0: 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b  && zName==0; i++
a7e0: 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20  , rc &= 0xff){. 
a7f0: 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b     switch( rc ){
a800: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a810: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20  TE_OK:          
a820: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a830: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
a840: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a850: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a860: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
a870: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a880: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
a890: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a8a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a8b0: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20  LITE_INTERNAL:  
a8c0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a8d0: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
a8e0: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
a8f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a900: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
a910: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a920: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a940: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a950: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20  SQLITE_ABORT:   
a960: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a970: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
a980: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a990: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a9a0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
a9b0: 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d  LLBACK:     zNam
a9c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
a9d0: 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20  T_ROLLBACK";    
a9e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a9f0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
aa10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
aa20: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
aa30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aa40: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  se SQLITE_BUSY_R
aa50: 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e  ECOVERY:      zN
aa60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
aa70: 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20  SY_RECOVERY";   
aa80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aa90: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
aaa0: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a  SNAPSHOT:      z
aab0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
aac0: 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  USY_SNAPSHOT";  
aad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aae0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
aaf0: 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED:             
ab00: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ab10: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20  LOCKED";        
ab20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ab30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
ab40: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a  KED_SHAREDCACHE:
ab50: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ab60: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
ab70: 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  CHE";break;.    
ab80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
ab90: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
aba0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
abb0: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
abc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
abd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
abe0: 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20  EADONLY:        
abf0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ac00: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
ac10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ac20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ac30: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
ac40: 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  Y:  zName = "SQL
ac50: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
ac60: 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20  OVERY"; break;. 
ac70: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ac80: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
ac90: 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CK:  zName = "SQ
aca0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
acb0: 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  NTLOCK"; break;.
acc0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
acd0: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
ace0: 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ACK:  zName = "S
acf0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
ad00: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
ad10: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ad20: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
ad30: 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  VED:   zName = "
ad40: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
ad50: 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b  DBMOVED";  break
ad60: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ad70: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
ad80: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ad90: 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  "SQLITE_INTERRUP
ada0: 54 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  T";         brea
adb0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
adc0: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
add0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ade0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b   "SQLITE_IOERR";
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
ae00: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
ae20: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
ae30: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ae40: 52 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72  READ";        br
ae50: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ae60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
ae70: 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65  RT_READ:   zName
ae80: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ae90: 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62  _SHORT_READ";  b
aea0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aeb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
aec0: 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ITE:        zNam
aed0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
aee0: 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20 20  R_WRITE";       
aef0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
af00: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
af10: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61  SYNC:        zNa
af20: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
af30: 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20  RR_FSYNC";      
af40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
af50: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
af60: 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e  DIR_FSYNC:    zN
af70: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
af80: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20  ERR_DIR_FSYNC"; 
af90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
afa0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
afb0: 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a  _TRUNCATE:     z
afc0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
afd0: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20  OERR_TRUNCATE"; 
afe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aff0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b000: 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20 20  R_FSTAT:        
b010: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b020: 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20  IOERR_FSTAT";   
b030: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b040: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b050: 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20  RR_UNLOCK:      
b060: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b070: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20  _IOERR_UNLOCK"; 
b080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b090: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b0a0: 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20  ERR_RDLOCK:     
b0b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b0c0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b  E_IOERR_RDLOCK";
b0d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b0e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b0f0: 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20  OERR_DELETE:    
b100: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b110: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22  TE_IOERR_DELETE"
b120: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b130: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b140: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20  IOERR_NOMEM:    
b150: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b160: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22  ITE_IOERR_NOMEM"
b170: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b180: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b190: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20  _IOERR_ACCESS:  
b1a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b1b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
b1c0: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
b1d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b1e0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b1f0: 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20  ERVEDLOCK:.     
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b210: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b220: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b230: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
b240: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
b250: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b260: 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20  ERR_LOCK:       
b270: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b280: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20  E_IOERR_LOCK";  
b290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b2a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b2b0: 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20  OERR_CLOSE:     
b2c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b2d0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b  TE_IOERR_CLOSE";
b2e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b2f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b300: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a  IOERR_DIR_CLOSE:
b310: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b320: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
b330: 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OSE";   break;. 
b340: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b350: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20  _IOERR_SHMOPEN: 
b360: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b370: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
b380: 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EN";     break;.
b390: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b3a0: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a  E_IOERR_SHMSIZE:
b3b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b3c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
b3d0: 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  IZE";     break;
b3e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b3f0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
b400: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b410: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b420: 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b  LOCK";     break
b430: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b440: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
b450: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b460: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b470: 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65 61  MMAP";      brea
b480: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b490: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a  LITE_IOERR_SEEK:
b4a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b4b0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b4c0: 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  EEK";        bre
b4d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b4e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b4f0: 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20  TE_NOENT: zName 
b500: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b510: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72  DELETE_NOENT";br
b520: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b530: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
b540: 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  P:         zName
b550: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b560: 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62  _MMAP";        b
b570: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b580: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
b590: 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d  TTEMPPATH:  zNam
b5a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b5b0: 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20  R_GETTEMPPATH"; 
b5c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b5d0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
b5e0: 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61  ONVPATH:     zNa
b5f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b600: 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20  RR_CONVPATH";   
b610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b620: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
b630: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  T:            zN
b640: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b650: 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20  RRUPT";         
b660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b670: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
b680: 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a  PT_VTAB:       z
b690: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b6a0: 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20  ORRUPT_VTAB";   
b6b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b6c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46  case SQLITE_NOTF
b6d0: 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20  OUND:           
b6e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b6f0: 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20  NOTFOUND";      
b700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b710: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c   case SQLITE_FUL
b720: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
b730: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b740: 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20  _FULL";         
b750: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b760: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b770: 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  NTOPEN:         
b780: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b790: 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20  E_CANTOPEN";    
b7a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b7b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b7c0: 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49  ANTOPEN_NOTEMPDI
b7d0: 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  R: zName = "SQLI
b7e0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45  TE_CANTOPEN_NOTE
b7f0: 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20  MPDIR";break;.  
b800: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b810: 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20  CANTOPEN_ISDIR: 
b820: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b830: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
b840: 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  IR";    break;. 
b850: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b860: 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
b870: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
b880: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
b890: 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  LLPATH"; break;.
b8a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b8b0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
b8c0: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
b8d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
b8e0: 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  ONVPATH"; break;
b8f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b900: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20  TE_PROTOCOL:    
b910: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b920: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22  SQLITE_PROTOCOL"
b930: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b940: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b950: 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20  ITE_EMPTY:      
b960: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b970: 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20  "SQLITE_EMPTY"; 
b980: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b990: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b9a0: 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20  LITE_SCHEMA:    
b9b0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b9c0: 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22   "SQLITE_SCHEMA"
b9d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
b9e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b9f0: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20  QLITE_TOOBIG:   
ba00: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ba10: 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  = "SQLITE_TOOBIG
ba20: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
ba30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba40: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ba50: 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  T:         zName
ba60: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
ba70: 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62  RAINT";        b
ba80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ba90: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
baa0: 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d  NT_UNIQUE:  zNam
bab0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
bac0: 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20  TRAINT_UNIQUE"; 
bad0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bae0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
baf0: 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61  INT_TRIGGER: zNa
bb00: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
bb10: 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22  STRAINT_TRIGGER"
bb20: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
bb30: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
bb40: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a  AINT_FOREIGNKEY:
bb50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bb80: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
bb90: 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b  IGNKEY";   break
bba0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bbb0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
bbc0: 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  HECK:   zName = 
bbd0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
bbe0: 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61  NT_CHECK";  brea
bbf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bc00: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bc10: 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20  PRIMARYKEY:.    
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bc40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
bc50: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
bc60: 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  Y";   break;.   
bc70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bc80: 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c  ONSTRAINT_NOTNUL
bc90: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
bca0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f  TE_CONSTRAINT_NO
bcb0: 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  TNULL";break;.  
bcc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bcd0: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
bce0: 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20  THOOK:.         
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bd10: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bd20: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20  T_COMMITHOOK";  
bd30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bd40: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
bd50: 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e  AINT_VTAB:    zN
bd60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
bd70: 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20  NSTRAINT_VTAB"; 
bd80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bd90: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bda0: 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a  RAINT_FUNCTION:.
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bde0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
bdf0: 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ION";     break;
be00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be10: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
be20: 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  WID:   zName = "
be30: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
be40: 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b  T_ROWID";  break
be50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
be60: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
be70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
be80: 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48  "SQLITE_MISMATCH
be90: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
bea0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
beb0: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
bec0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bed0: 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22   "SQLITE_MISUSE"
bee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
bef0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bf00: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20  QLITE_NOLFS:    
bf10: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bf20: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22  = "SQLITE_NOLFS"
bf30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
bf40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bf50: 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20  SQLITE_AUTH:    
bf60: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bf70: 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22   = "SQLITE_AUTH"
bf80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
bf90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bfa0: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20   SQLITE_FORMAT: 
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bfc0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d  e = "SQLITE_FORM
bfd0: 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  AT";            
bfe0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bff0: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c010: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e  me = "SQLITE_RAN
c020: 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  GE";            
c030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c040: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
c050: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
c060: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c070: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20  TADB";          
c080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c090: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20  ase SQLITE_ROW: 
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c0b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
c0c0: 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OW";            
c0d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c0e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
c0f0: 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  CE:             
c100: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c110: 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20  NOTICE";        
c120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c130: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
c140: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a  ICE_RECOVER_WAL:
c150: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c160: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
c170: 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  WAL";break;.    
c180: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c190: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
c1a0: 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  LBACK:.         
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c1d0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
c1e0: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b  COVER_ROLLBACK";
c1f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c200: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
c210: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  G:            zN
c220: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
c230: 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20  RNING";         
c240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c250: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
c260: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a  NG_AUTOINDEX:  z
c270: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
c280: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
c290: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
c2a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45  case SQLITE_DONE
c2b0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
c2c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c2d0: 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20  DONE";          
c2e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c2f0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
c300: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
c310: 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b  c char zBuf[50];
c320: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
c330: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
c340: 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54  f), zBuf, "SQLIT
c350: 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20  E_UNKNOWN(%d)", 
c360: 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61  origRc);.    zNa
c370: 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  me = zBuf;.  }. 
c380: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
c390: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
c3a0: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
c3b0: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
c3c0: 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
c3d0: 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
c3e0: 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
c3f0: 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ent..*/.const ch
c400: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74  ar *sqlite3ErrSt
c410: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61  r(int rc){.  sta
c420: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  tic const char* 
c430: 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b  const aMsg[] = {
c440: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  .    /* SQLITE_O
c450: 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e  K          */ "n
c460: 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20  ot an error",.  
c470: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f    /* SQLITE_ERRO
c480: 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20  R       */ "SQL 
c490: 6c 6f 67 69 63 20 65 72 72 6f 72 22 2c 0a 20 20  logic error",.  
c4a0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
c4b0: 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20  RNAL    */ 0,.  
c4c0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d    /* SQLITE_PERM
c4d0: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65          */ "acce
c4e0: 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65  ss permission de
c4f0: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
c500: 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20  LITE_ABORT      
c510: 20 2a 2f 20 22 71 75 65 72 79 20 61 62 6f 72 74   */ "query abort
c520: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c530: 54 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a  TE_BUSY        *
c540: 2f 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c  / "database is l
c550: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
c560: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20  QLITE_LOCKED    
c570: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74    */ "database t
c580: 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c  able is locked",
c590: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
c5a0: 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f  OMEM       */ "o
c5b0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20  ut of memory",. 
c5c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41     /* SQLITE_REA
c5d0: 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74  DONLY    */ "att
c5e0: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20  empt to write a 
c5f0: 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73  readonly databas
c600: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
c610: 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f  E_INTERRUPT   */
c620: 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a   "interrupted",.
c630: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f      /* SQLITE_IO
c640: 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69  ERR       */ "di
c650: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20  sk I/O error",. 
c660: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52     /* SQLITE_COR
c670: 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74  RUPT     */ "dat
c680: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
c690: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a   is malformed",.
c6a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
c6b0: 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e  TFOUND    */ "un
c6c0: 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22  known operation"
c6d0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c6e0: 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22  FULL        */ "
c6f0: 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b  database or disk
c700: 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f   is full",.    /
c710: 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  * SQLITE_CANTOPE
c720: 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20  N    */ "unable 
c730: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
c740: 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53   file",.    /* S
c750: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20  QLITE_PROTOCOL  
c760: 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72    */ "locking pr
c770: 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20  otocol",.    /* 
c780: 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20  SQLITE_EMPTY    
c790: 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20     */ 0,.    /* 
c7a0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20  SQLITE_SCHEMA   
c7b0: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
c7c0: 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67  schema has chang
c7d0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c7e0: 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a  TE_TOOBIG      *
c7f0: 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  / "string or blo
c800: 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20  b too big",.    
c810: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  /* SQLITE_CONSTR
c820: 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72  AINT  */ "constr
c830: 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20  aint failed",.  
c840: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d    /* SQLITE_MISM
c850: 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61  ATCH    */ "data
c860: 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a  type mismatch",.
c870: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
c880: 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 62 61  SUSE      */ "ba
c890: 64 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20 6f  d parameter or o
c8a0: 74 68 65 72 20 41 50 49 20 6d 69 73 75 73 65 22  ther API misuse"
c8b0: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
c8c0: 44 49 53 41 42 4c 45 5f 4c 46 53 0a 20 20 20 20  DISABLE_LFS.    
c8d0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20  /* SQLITE_NOLFS 
c8e0: 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20        */ "large 
c8f0: 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20  file support is 
c900: 64 69 73 61 62 6c 65 64 22 2c 0a 23 65 6c 73 65  disabled",.#else
c910: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
c920: 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 30 2c  OLFS       */ 0,
c930: 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 53  .#endif.    /* S
c940: 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20  QLITE_AUTH      
c950: 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74    */ "authorizat
c960: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
c970: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41   /* SQLITE_FORMA
c980: 54 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  T      */ 0,.   
c990: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45   /* SQLITE_RANGE
c9a0: 20 20 20 20 20 20 20 2a 2f 20 22 63 6f 6c 75 6d         */ "colum
c9b0: 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72  n index out of r
c9c0: 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ange",.    /* SQ
c9d0: 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20  LITE_NOTADB     
c9e0: 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 6e 6f 74   */ "file is not
c9f0: 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20   a database",.  
ca00: 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
ca10: 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  *zErr = "unknown
ca20: 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63   error";.  switc
ca30: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73  h( rc ){.    cas
ca40: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  e SQLITE_ABORT_R
ca50: 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20  OLLBACK: {.     
ca60: 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64   zErr = "abort d
ca70: 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b  ue to ROLLBACK";
ca80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ca90: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
caa0: 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30   {.      rc &= 0
cab0: 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41  xff;.      if( A
cac0: 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20  LWAYS(rc>=0) && 
cad0: 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73  rc<ArraySize(aMs
cae0: 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d  g) && aMsg[rc]!=
caf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72  0 ){.        zEr
cb00: 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20  r = aMsg[rc];.  
cb10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
cb20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
cb30: 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f  eturn zErr;.}../
cb40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cb50: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62  e implements a b
cb60: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61  usy callback tha
cb70: 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69  t sleeps and tri
cb80: 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69  es.** again unti
cb90: 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  l a timeout valu
cba0: 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54  e is reached.  T
cbb0: 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65  he timeout value
cbc0: 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65   is.** an intege
cbd0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
cbe0: 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20  iseconds passed 
cbf0: 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  in as the first.
cc00: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
cc10: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
cc20: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
cc30: 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72  back(. void *ptr
cc40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cc50: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
cc60: 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63  ection */. int c
cc70: 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  ount            
cc80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cc90: 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73   times table has
cca0: 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b   been busy */.){
ccb0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
ccc0: 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45  IN || HAVE_USLEE
ccd0: 50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  P.  static const
cce0: 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20   u8 delays[] =. 
ccf0: 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31      { 1, 2, 5, 1
cd00: 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32  0, 15, 20, 25, 2
cd10: 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30  5,  25,  50,  50
cd20: 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69  , 100 };.  stati
cd30: 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c  c const u8 total
cd40: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20  s[] =.     { 0, 
cd50: 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33  1, 3,  8, 18, 33
cd60: 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31  , 53, 78, 103, 1
cd70: 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a  28, 178, 228 };.
cd80: 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20  # define NDELAY 
cd90: 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73  ArraySize(delays
cda0: 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ).  sqlite3 *db 
cdb0: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72  = (sqlite3 *)ptr
cdc0: 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20  ;.  int timeout 
cdd0: 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75  = db->busyTimeou
cde0: 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20  t;.  int delay, 
cdf0: 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74  prior;..  assert
ce00: 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20  ( count>=0 );.  
ce10: 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c  if( count < NDEL
ce20: 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  AY ){.    delay 
ce30: 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b  = delays[count];
ce40: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
ce50: 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65  als[count];.  }e
ce60: 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  lse{.    delay =
ce70: 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31   delays[NDELAY-1
ce80: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
ce90: 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20  otals[NDELAY-1] 
cea0: 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28  + delay*(count-(
ceb0: 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a  NDELAY-1));.  }.
cec0: 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65    if( prior + de
ced0: 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b  lay > timeout ){
cee0: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d  .    delay = tim
cef0: 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20  eout - prior;.  
cf00: 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29    if( delay<=0 )
cf10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cf20: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
cf30: 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a  db->pVfs, delay*
cf40: 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
cf50: 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74  1;.#else.  sqlit
cf60: 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65  e3 *db = (sqlite
cf70: 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74  3 *)ptr;.  int t
cf80: 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74  imeout = ((sqlit
cf90: 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54  e3 *)ptr)->busyT
cfa0: 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63  imeout;.  if( (c
cfb0: 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74  ount+1)*1000 > t
cfc0: 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65  imeout ){.    re
cfd0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
cfe0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
cff0: 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b  >pVfs, 1000000);
d000: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
d010: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  dif.}../*.** Inv
d020: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75  oke the given bu
d030: 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a  sy handler..**.*
d040: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d050: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
d060: 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65   operation faile
d070: 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a  d with a lock..*
d080: 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
d090: 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  e returns non-ze
d0a0: 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
d0b0: 72 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a  retried.  If it.
d0c0: 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68  ** returns 0, th
d0d0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72  e operation abor
d0e0: 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54  ts with an SQLIT
d0f0: 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f  E_BUSY error..*/
d100: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f  .int sqlite3Invo
d110: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75  keBusyHandler(Bu
d120: 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20  syHandler *p){. 
d130: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e   int rc;.  if( N
d140: 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d  EVER(p==0) || p-
d150: 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e  >xFunc==0 || p->
d160: 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e  nBusy<0 ) return
d170: 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46   0;.  rc = p->xF
d180: 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e  unc(p->pArg, p->
d190: 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63  nBusy);.  if( rc
d1a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42  ==0 ){.    p->nB
d1b0: 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  usy = -1;.  }els
d1c0: 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b  e{.    p->nBusy+
d1d0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
d1e0: 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc; .}../*.** Th
d1f0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
d200: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
d210: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
d220: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
d230: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
d240: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
d250: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
d260: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
d270: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
d280: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
d290: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76    int (*xBusy)(v
d2a0: 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  oid*,int),.  voi
d2b0: 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65  d *pArg.){.#ifde
d2c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d2d0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
d2e0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
d2f0: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
d300: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
d310: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
d320: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d330: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d340: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
d350: 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b  r.xFunc = xBusy;
d360: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
d370: 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  er.pArg = pArg;.
d380: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
d390: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64  r.nBusy = 0;.  d
d3a0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
d3b0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
d3c0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
d3d0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
d3e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
d3f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d400: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
d410: 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
d420: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70  utine sets the p
d430: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
d440: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
d450: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
d460: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
d470: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
d480: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
d490: 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  t. The progress 
d4a0: 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a  callback will.**
d4b0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72   be invoked ever
d4c0: 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a  y nOps opcodes..
d4d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
d4e0: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
d4f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
d500: 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20   .  int nOps,.  
d510: 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29  int (*xProgress)
d520: 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64  (void*), .  void
d530: 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66   *pArg.){.#ifdef
d540: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
d550: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
d560: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
d570: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
d580: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
d590: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
d5a0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
d5b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d5c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
d5d0: 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20  );.  if( nOps>0 
d5e0: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  ){.    db->xProg
d5f0: 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73  ress = xProgress
d600: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
d610: 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e  essOps = (unsign
d620: 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d  ed)nOps;.    db-
d630: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
d640: 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pArg;.  }else{. 
d650: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
d660: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50   = 0;.    db->nP
d670: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a  rogressOps = 0;.
d680: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
d690: 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  sArg = 0;.  }.  
d6a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d6b0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
d6c0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
d6d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   This routine in
d6e0: 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74  stalls a default
d6f0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68   busy handler th
d700: 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65  at waits for the
d710: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75  .** specified nu
d720: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
d730: 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75  onds before retu
d740: 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rning 0..*/.int 
d750: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
d760: 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eout(sqlite3 *db
d770: 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65  , int ms){.#ifde
d780: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d790: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
d7a0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
d7b0: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
d7c0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
d7d0: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
d7e0: 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20  if( ms>0 ){.    
d7f0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
d800: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
d810: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
d820: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
d830: 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65      db->busyTime
d840: 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73  out = ms;.  }els
d850: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  e{.    sqlite3_b
d860: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
d870: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
d880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d890: 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e  ../*.** Cause an
d8a0: 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74  y pending operat
d8b0: 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69  ion to stop at i
d8c0: 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f  ts earliest oppo
d8d0: 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  rtunity..*/.void
d8e0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
d8f0: 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  pt(sqlite3 *db){
d900: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d910: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
d920: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
d930: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
d940: 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  && (db==0 || db-
d950: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
d960: 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20 29 7b 0a  AGIC_ZOMBIE) ){.
d970: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
d980: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
d990: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
d9a0: 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73  ndif.  db->u1.is
d9b0: 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b  Interrupted = 1;
d9c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
d9d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63  function is exac
d9e0: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20  tly the same as 
d9f0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
da00: 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70  unction(), excep
da10: 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  t.** that it is 
da20: 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63  designed to be c
da30: 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61  alled by interna
da40: 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66  l code. The diff
da50: 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61  erence is.** tha
da60: 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  t if a malloc() 
da70: 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33  fails in sqlite3
da80: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
da90: 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  (), an error cod
daa0: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
dab0: 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46   and the mallocF
dac0: 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72  ailed flag clear
dad0: 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ed. .*/.int sqli
dae0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20  te3CreateFunc(. 
daf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
db00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
db10: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
db20: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
db30: 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44  ,.  void *pUserD
db40: 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  ata,.  void (*xS
db50: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
db60: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
db70: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
db80: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
db90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
dba0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
dbb0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
dbc0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
dbd0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63  ontext*),.  Func
dbe0: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
dbf0: 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e  tructor.){.  Fun
dc00: 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cDef *p;.  int n
dc10: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72  Name;.  int extr
dc20: 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72  aFlags;..  asser
dc30: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dc40: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
dc50: 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74   );.  if( zFunct
dc60: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20  ionName==0 ||.  
dc70: 20 20 20 20 28 78 53 46 75 6e 63 20 26 26 20 28      (xSFunc && (
dc80: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
dc90: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 53  ) || .      (!xS
dca0: 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20  Func && (xFinal 
dcb0: 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20  && !xStep)) ||. 
dcc0: 20 20 20 20 20 28 21 78 53 46 75 6e 63 20 26 26       (!xSFunc &&
dcd0: 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74   (!xFinal && xSt
dce0: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e  ep)) ||.      (n
dcf0: 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53  Arg<-1 || nArg>S
dd00: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
dd10: 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20  ON_ARG) ||.     
dd20: 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73   (255<(nName = s
dd30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20  qlite3Strlen30( 
dd40: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29  zFunctionName)))
dd50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
dd60: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
dd70: 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  T;.  }..  assert
dd80: 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  ( SQLITE_FUNC_CO
dd90: 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44  NSTANT==SQLITE_D
dda0: 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a  ETERMINISTIC );.
ddb0: 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65    extraFlags = e
ddc0: 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54  nc &  SQLITE_DET
ddd0: 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e  ERMINISTIC;.  en
dde0: 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e  c &= (SQLITE_FUN
ddf0: 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45  C_ENCMASK|SQLITE
de00: 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65  _ANY);.  .#ifnde
de10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
de20: 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  F16.  /* If SQLI
de30: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
de40: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
de50: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
de60: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
de70: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
de80: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
de90: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
dea0: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
deb0: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
dec0: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
ded0: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
dee0: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ernally..  **.  
def0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59  ** If SQLITE_ANY
df00: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61   is specified, a
df10: 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e  dd three version
df20: 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  s of the functio
df30: 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61  n.  ** to the ha
df40: 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  sh table..  */. 
df50: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
df60: 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e  _UTF16 ){.    en
df70: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
df80: 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20  NATIVE;.  }else 
df90: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
dfa0: 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ANY ){.    int r
dfb0: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
dfc0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
dfd0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
dfe0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
dff0: 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  F8|extraFlags,. 
e000: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
e010: 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  a, xSFunc, xStep
e020: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
e030: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
e040: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e050: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e060: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
e070: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
e080: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
e090: 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73  F16LE|extraFlags
e0a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
e0b0: 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78  rData, xSFunc, x
e0c0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44  Step, xFinal, pD
e0d0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
e0e0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
e0f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e100: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e110: 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  }.    enc = SQLI
e120: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a  TE_UTF16BE;.  }.
e130: 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51  #else.  enc = SQ
e140: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69  LITE_UTF8;.#endi
e150: 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  f.  .  /* Check 
e160: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66  if an existing f
e170: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
e180: 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64   overridden or d
e190: 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20  eleted. If so,. 
e1a0: 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
e1b0: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68  e active VMs, th
e1c0: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
e1d0: 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63  _BUSY. If a func
e1e0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69  tion.  ** is bei
e1f0: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65  ng overridden/de
e200: 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20  leted but there 
e210: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
e220: 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a  s, allow the.  *
e230: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63  * operation to c
e240: 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61  ontinue but inva
e250: 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f  lidate all preco
e260: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
e270: 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  s..  */.  p = sq
e280: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
e290: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
e2a0: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
e2b0: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
e2c0: 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73  && (p->funcFlags
e2d0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
e2e0: 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20  NCMASK)==enc && 
e2f0: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b  p->nArg==nArg ){
e300: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
e310: 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
e320: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
e330: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
e340: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
e350: 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
e360: 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75  e/modify user-fu
e370: 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63  nction due to ac
e380: 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
e390: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e3a0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
e3b0: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
e3c0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
e3d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e3e0: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
e3f0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
e400: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
e410: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
e420: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
e430: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
e440: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b  rg, (u8)enc, 1);
e450: 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64  .  assert(p || d
e460: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
e470: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
e480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e490: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
e4a0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65  .  /* If an olde
e4b0: 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  r version of the
e4c0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61   function with a
e4d0: 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74   configured dest
e4e0: 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62  ructor is.  ** b
e4f0: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e  eing replaced in
e500: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
e510: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  tor function her
e520: 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e  e. */.  function
e530: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
e540: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
e550: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
e560: 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  uctor->nRef++;. 
e570: 20 7d 0a 20 20 70 2d 3e 75 2e 70 44 65 73 74 72   }.  p->u.pDestr
e580: 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63  uctor = pDestruc
e590: 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c  tor;.  p->funcFl
e5a0: 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c  ags = (p->funcFl
e5b0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
e5c0: 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74  C_ENCMASK) | ext
e5d0: 72 61 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63  raFlags;.  testc
e5e0: 61 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67  ase( p->funcFlag
e5f0: 73 20 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52  s & SQLITE_DETER
e600: 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d  MINISTIC );.  p-
e610: 3e 78 53 46 75 6e 63 20 3d 20 78 53 46 75 6e 63  >xSFunc = xSFunc
e620: 20 3f 20 78 53 46 75 6e 63 20 3a 20 78 53 74 65   ? xSFunc : xSte
e630: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
e640: 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d  e = xFinal;.  p-
e650: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
e660: 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72  erData;.  p->nAr
e670: 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20  g = (u16)nArg;. 
e680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e690: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
e6a0: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
e6b0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
e6c0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e6d0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
e6e0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
e6f0: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
e700: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
e710: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
e720: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
e730: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e740: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e750: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e760: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
e770: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e780: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e790: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
e7a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
e7b0: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
e7c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e7d0: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e  tion_v2(db, zFun
e7e0: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
e7f0: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a   xSFunc, xStep,.
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a      xFinal, 0);.
e830: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  }..int sqlite3_c
e840: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
e850: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
e860: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e870: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
e880: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
e890: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
e8a0: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e8b0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e8c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e8d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e8e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e8f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e900: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e910: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e920: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
e930: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29  void (*xDestroy)
e940: 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e  (void *).){.  in
e950: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
e960: 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72  ROR;.  FuncDestr
e970: 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b  uctor *pArg = 0;
e980: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e990: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e9a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
e9b0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
e9c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e9d0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e9e0: 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
e9f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ea00: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ea10: 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29    if( xDestroy )
ea20: 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75  {.    pArg = (Fu
ea30: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73  ncDestructor *)s
ea40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
ea50: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75  ro(db, sizeof(Fu
ea60: 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a  ncDestructor));.
ea70: 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b      if( !pArg ){
ea80: 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28  .      xDestroy(
ea90: 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  p);.      goto o
eaa0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ut;.    }.    pA
eab0: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
eac0: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
ead0: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
eae0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
eaf0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
eb00: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
eb10: 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20  enc, p, xSFunc, 
eb20: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
eb30: 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67  Arg);.  if( pArg
eb40: 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d   && pArg->nRef==
eb50: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
eb60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
eb70: 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70  ;.    xDestroy(p
eb80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
eb90: 46 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a  Free(db, pArg);.
eba0: 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20    }.. out:.  rc 
ebb0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
ebc0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
ebd0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ebe0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
ebf0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
ec00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ec10: 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65  UTF16.int sqlite
ec20: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
ec30: 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  n16(.  sqlite3 *
ec40: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db,.  const void
ec50: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
ec60: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
ec70: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76  nt eTextRep,.  v
ec80: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
ec90: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
eca0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
ecb0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
ecc0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
ecd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
ece0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
ecf0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
ed00: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
ed10: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69  context*).){.  i
ed20: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
ed30: 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53  Func8;..#ifdef S
ed40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
ed50: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
ed60: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
ed70: 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74  Ok(db) || zFunct
ed80: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ionName==0 ) ret
ed90: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
eda0: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
edb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
edc0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
edd0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
ede0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
edf0: 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74    zFunc8 = sqlit
ee00: 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
ee10: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31  FunctionName, -1
ee20: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
ee30: 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71  TIVE);.  rc = sq
ee40: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
ee50: 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67  db, zFunc8, nArg
ee60: 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78  , eTextRep, p, x
ee70: 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e  SFunc,xStep,xFin
ee80: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
ee90: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
eea0: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
eeb0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
eec0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
eed0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
eee0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
eef0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
ef00: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
ef10: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
ef20: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
ef30: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
ef40: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
ef50: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
ef60: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
ef70: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
ef80: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
ef90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
efa0: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
efb0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
efc0: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
efd0: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
efe0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
eff0: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
f000: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
f010: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
f020: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
f030: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
f040: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
f050: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
f060: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
f070: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
f080: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
f090: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
f0a0: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
f0b0: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
f0c0: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
f0d0: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
f0e0: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
f0f0: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
f100: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
f110: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
f120: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
f130: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
f140: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f150: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f160: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f170: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f180: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f190: 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ) || zName==0 ||
f1a0: 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20   nArg<-2 ){.    
f1b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
f1c0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
f1d0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f1e0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f1f0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
f200: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
f210: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  n(db, zName, nAr
f220: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
f230: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  0)==0 ){.    rc 
f240: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
f250: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
f260: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
f270: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
f290: 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
f2a0: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  nction, 0, 0, 0)
f2b0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f2c0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
f2d0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
f2e0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f2f0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f300: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
f310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
f320: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f330: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
f340: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
f350: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
f360: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
f370: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
f380: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
f390: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
f3a0: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
f3b0: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
f3c0: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
f3d0: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
f3e0: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
f3f0: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
f400: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f410: 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74  f each.** SQL st
f420: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e  atement..*/.#ifn
f430: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f440: 44 45 50 52 45 43 41 54 45 44 0a 76 6f 69 64 20  DEPRECATED.void 
f450: 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73  *sqlite3_trace(s
f460: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
f470: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
f480: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
f490: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
f4a0: 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
f4b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f4c0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f4d0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f4e0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f4f0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
f500: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
f510: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
f520: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f530: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f540: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
f550: 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64  ->pTraceArg;.  d
f560: 62 2d 3e 6d 54 72 61 63 65 20 3d 20 78 54 72 61  b->mTrace = xTra
f570: 63 65 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 43  ce ? SQLITE_TRAC
f580: 45 5f 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20 20  E_LEGACY : 0;.  
f590: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 28 69 6e  db->xTrace = (in
f5a0: 74 28 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76  t(*)(u32,void*,v
f5b0: 6f 69 64 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61  oid*,void*))xTra
f5c0: 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65  ce;.  db->pTrace
f5d0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
f5e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f5f0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
f600: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
f610: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f620: 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 20  OMIT_DEPRECATED 
f630: 2a 2f 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72 20  */../* Register 
f640: 61 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b  a trace callback
f650: 20 75 73 69 6e 67 20 74 68 65 20 76 65 72 73 69   using the versi
f660: 6f 6e 2d 32 20 69 6e 74 65 72 66 61 63 65 2e 0a  on-2 interface..
f670: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
f680: 72 61 63 65 5f 76 32 28 0a 20 20 73 71 6c 69 74  race_v2(.  sqlit
f690: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 20 20 20 20 20 2f 2a 20 54 72 61 63 65 20 74        /* Trace t
f6c0: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
f6d0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 72  /.  unsigned mTr
f6e0: 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f700: 2a 20 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74 73  * Mask of events
f710: 20 74 6f 20 62 65 20 74 72 61 63 65 64 20 2a 2f   to be traced */
f720: 0a 20 20 69 6e 74 28 2a 78 54 72 61 63 65 29 28  .  int(*xTrace)(
f730: 75 6e 73 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76  unsigned,void*,v
f740: 6f 69 64 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a  oid*,void*),  /*
f750: 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76   Callback to inv
f760: 6f 6b 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  oke */.  void *p
f770: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a      /* Context *
f7a0: 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  /.){.#ifdef SQLI
f7b0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f7c0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f7d0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f7e0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
f7f0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
f800: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
f810: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f820: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f830: 29 3b 0a 20 20 69 66 28 20 6d 54 72 61 63 65 3d  );.  if( mTrace=
f840: 3d 30 20 29 20 78 54 72 61 63 65 20 3d 20 30 3b  =0 ) xTrace = 0;
f850: 0a 20 20 69 66 28 20 78 54 72 61 63 65 3d 3d 30  .  if( xTrace==0
f860: 20 29 20 6d 54 72 61 63 65 20 3d 20 30 3b 0a 20   ) mTrace = 0;. 
f870: 20 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 6d 54   db->mTrace = mT
f880: 72 61 63 65 3b 0a 20 20 64 62 2d 3e 78 54 72 61  race;.  db->xTra
f890: 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64  ce = xTrace;.  d
f8a0: 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
f8b0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
f8c0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f8d0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f8e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
f8f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f900: 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
f910: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72  ** Register a pr
f920: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20  ofile function. 
f930: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
f940: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
f950: 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f  gistered .** pro
f960: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  file function is
f970: 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
f980: 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c  ** A NULL profil
f990: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
f9a0: 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69   that no profili
f9b0: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
f9c0: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70   A non-NULL.** p
f9d0: 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e  rofile is a poin
f9e0: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
f9f0: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
fa00: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
fa10: 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53  ion of.** each S
fa20: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  QL statement tha
fa30: 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  t is run..*/.voi
fa40: 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69  d *sqlite3_profi
fa50: 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le(.  sqlite3 *d
fa60: 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f  b,.  void (*xPro
fa70: 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  file)(void*,cons
fa80: 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75  t char*,sqlite_u
fa90: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
faa0: 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  pArg.){.  void *
fab0: 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOld;..#ifdef SQ
fac0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
fad0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
fae0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
faf0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
fb00: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
fb10: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
fb20: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
fb30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fb40: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
fb50: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
fb60: 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62  ProfileArg;.  db
fb70: 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72  ->xProfile = xPr
fb80: 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72  ofile;.  db->pPr
fb90: 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b  ofileArg = pArg;
fba0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fbb0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
fbc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
fbd0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fbe0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
fbf0: 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  ATED */.#endif /
fc00: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  * SQLITE_OMIT_TR
fc10: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
fc20: 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f  gister a functio
fc30: 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
fc40: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
fc50: 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49  on commits..** I
fc60: 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75  f the invoked fu
fc70: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
fc80: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
fc90: 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73  e commit becomes
fca0: 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a   a.** rollback..
fcb0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
fcc0: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20  _commit_hook(.  
fcd0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
fce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
fcf0: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
fd00: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
fd10: 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
fd20: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20  ck)(void*),  /* 
fd30: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f  Function to invo
fd40: 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69  ke on each commi
fd50: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  t */.  void *pAr
fd60: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
fd70: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
fd80: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
fd90: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
fda0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fdb0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
fdc0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
fdd0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
fde0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
fdf0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
fe00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
fe10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
fe20: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
fe30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
fe40: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
fe50: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
fe60: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
fe70: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
fe80: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
fe90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
fea0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
feb0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
fec0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
fed0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
fee0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
fef0: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
ff00: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
ff10: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
ff20: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
ff30: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
ff40: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
ff50: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
ff60: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
ff70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
ff80: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
ff90: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
ffa0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
ffb0: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
ffc0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
ffd0: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
ffe0: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
fff0: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
10000 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
10010 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
10020 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
10030 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Ret;..#ifdef SQL
10040 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10050 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
10060 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
10070 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
10080 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
10090 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
100a0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
100b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
100c0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
100d0 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55  .  pRet = db->pU
100e0 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e  pdateArg;.  db->
100f0 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  xUpdateCallback 
10100 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
10110 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20  b->pUpdateArg = 
10120 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
10130 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10140 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10150 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
10160 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
10170 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
10180 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
10190 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
101a0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74  led.** back by t
101b0 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
101c0 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
101d0 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61   *sqlite3_rollba
101e0 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  ck_hook(.  sqlit
101f0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
10200 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
10210 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
10220 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
10230 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
10240 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62  void*), /* Callb
10250 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
10260 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
10270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10280 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
10290 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
102a0 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66  void *pRet;..#if
102b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
102c0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
102d0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
102e0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
102f0 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
10300 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
10310 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
10320 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
10330 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
10340 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
10350 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
10360 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  g;.  db->xRollba
10370 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  ckCallback = xCa
10380 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52  llback;.  db->pR
10390 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72  ollbackArg = pAr
103a0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
103b0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
103c0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
103d0 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  et;.}..#ifdef SQ
103e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
103f0 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a  PDATE_HOOK./*.**
10400 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
10410 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
10420 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72  ed each time a r
10430 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  ow is updated,.*
10440 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65  * inserted or de
10450 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73  leted using this
10460 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
10470 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
10480 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
10490 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
104a0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
104b0 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
104c0 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
104d0 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
104e0 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20 20 20  (*xCallback)(   
104f0 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63        /* Callbac
10500 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
10510 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a    void*,sqlite3*
10520 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a  ,int,char const*
10530 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c  ,char const*,sql
10540 69 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74  ite3_int64,sqlit
10550 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e3_int64),.  voi
10560 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
10570 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
10580 63 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e  callback argumen
10590 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  t */.){.  void *
105a0 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
105b0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
105c0 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
105d0 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41   db->pPreUpdateA
105e0 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70  rg;.  db->xPreUp
105f0 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78  dateCallback = x
10600 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
10610 70 50 72 65 55 70 64 61 74 65 41 72 67 20 3d 20  pPreUpdateArg = 
10620 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
10630 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10640 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10650 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
10660 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10670 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
10680 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
10690 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
106a0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61  * The sqlite3_wa
106b0 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
106c0 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
106d0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
106e0 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a  checkpoint()..**
106f0 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
10700 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69  wal_checkpoint i
10710 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
10720 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
10730 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  g file.** is gre
10740 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65  ater than sqlite
10750 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74  3.pWalArg cast t
10760 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68  o an integer (th
10770 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
10780 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74  ed by.** wal_aut
10790 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a  ocheckpoint())..
107a0 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  */ .int sqlite3W
107b0 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20  alDefaultHook(. 
107c0 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61   void *pClientDa
107d0 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ta,     /* Argum
107e0 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
107f0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10800 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  /* Connection */
10810 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10820 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Db,       /* Dat
10830 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
10840 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  Frame           
10850 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c    /* Size of WAL
10860 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72   */.){.  if( nFr
10870 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f  ame>=SQLITE_PTR_
10880 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61  TO_INT(pClientDa
10890 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ta) ){.    sqlit
108a0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
108b0 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
108c0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
108d0 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  t(db, zDb);.    
108e0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
108f0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20  Malloc();.  }.  
10900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10910 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
10920 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
10930 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
10940 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  e an sqlite3_wal
10950 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
10960 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
10970 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  y checkpoint.** 
10980 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  a database after
10990 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
109a0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
109b0 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72  re are nFrame or
109c0 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20  .** more frames 
109d0 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  in the log file.
109e0 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72   Passing zero or
109f0 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   a negative valu
10a00 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61  e as the.** nFra
10a10 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73  me parameter dis
10a20 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20  ables automatic 
10a30 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69  checkpoints enti
10a40 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rely..**.** The 
10a50 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
10a60 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
10a70 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e  tion replaces an
10a80 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62  y existing callb
10a90 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65  ack.** registere
10aa0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
10ab0 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65  wal_hook(). Like
10ac0 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e  wise, registerin
10ad0 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  g a callback.** 
10ae0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
10af0 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65  l_hook() disable
10b00 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
10b10 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61  checkpoint mecha
10b20 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  nism.** configur
10b30 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
10b40 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
10b50 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
10b60 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
10b70 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b  db, int nFrame){
10b80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
10b90 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44  MIT_WAL.  UNUSED
10ba0 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
10bb0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10bc0 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73  ER(nFrame);.#els
10bd0 65 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  e.#ifdef SQLITE_
10be0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10bf0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10c00 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10c10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10c20 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
10c30 6e 64 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d  ndif.  if( nFram
10c40 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e>0 ){.    sqlit
10c50 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
10c60 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
10c70 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e  tHook, SQLITE_IN
10c80 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29  T_TO_PTR(nFrame)
10c90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10ca0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
10cb0 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
10cc0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
10cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10ce0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
10cf0 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
10d00 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
10d10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
10d20 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
10d30 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
10d40 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74  -log by this dat
10d50 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10d60 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
10d70 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73  e3_wal_hook(.  s
10d80 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10da0 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
10db0 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e  k to this db han
10dc0 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43  dle */.  int(*xC
10dd0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c  allback)(void *,
10de0 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74   sqlite3*, const
10df0 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20   char*, int),.  
10e00 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
10e30 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c  t passed to xCal
10e40 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69  lback() */.){.#i
10e50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10e60 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52  T_WAL.  void *pR
10e70 65 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  et;.#ifdef SQLIT
10e80 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10e90 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10ea0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10eb0 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
10ec0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
10ed0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
10ee0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
10ef0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10f00 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10f10 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c   pRet = db->pWal
10f20 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43  Arg;.  db->xWalC
10f30 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
10f40 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41  ack;.  db->pWalA
10f50 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
10f60 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10f70 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10f80 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73  eturn pRet;.#els
10f90 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e.  return 0;.#e
10fa0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
10fb0 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
10fc0 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e zDb..*/.int sq
10fd0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
10fe0 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74  oint_v2(.  sqlit
10ff0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
11000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
11010 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
11020 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11030 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
11040 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74     /* Name of at
11050 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
11060 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69  (or NULL) */.  i
11070 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20  nt eMode,       
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11090 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  * SQLITE_CHECKPO
110a0 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20  INT_* value */. 
110b0 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20   int *pnLog,    
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
110e0 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d   WAL log in fram
110f0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  es */.  int *pnC
11100 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20  kpt             
11110 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11120 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
11130 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e  frames checkpoin
11140 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66  ted */.){.#ifdef
11150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11160 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11170 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  _OK;.#else.  int
11180 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
111a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
111b0 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54   int iDb = SQLIT
111c0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20  E_MAX_ATTACHED; 
111d0 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b   /* sqlite3.aDb[
111e0 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f  ] index of db to
111f0 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a   checkpoint */..
11200 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11210 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
11220 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
11230 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
11240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
11250 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
11260 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  if..  /* Initial
11270 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76  ize the output v
11280 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69  ariables to -1 i
11290 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
112a0 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28  occurs. */.  if(
112b0 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20   pnLog ) *pnLog 
112c0 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b  = -1;.  if( pnCk
112d0 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d  pt ) *pnCkpt = -
112e0 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51  1;..  assert( SQ
112f0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
11300 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20  PASSIVE==0 );.  
11310 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
11320 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d  HECKPOINT_FULL==
11330 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
11340 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
11350 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20  _RESTART==2 );. 
11360 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
11370 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
11380 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20  ATE==3 );.  if( 
11390 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45  eMode<SQLITE_CHE
113a0 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20  CKPOINT_PASSIVE 
113b0 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f  || eMode>SQLITE_
113c0 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
113d0 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATE ){.    /* EV
113e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39  IDENCE-OF: R-039
113f0 39 36 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70  96-12088 The M p
11400 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65  arameter must be
11410 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f   a valid checkpo
11420 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a  int.    ** mode:
11430 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
11440 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
11450 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
11460 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
11470 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26  ex);.  if( zDb &
11480 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20  & zDb[0] ){.    
11490 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
114a0 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
114b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c  ;.  }.  if( iDb<
114c0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
114d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
114e0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
114f0 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45  Msg(db, SQLITE_E
11500 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  RROR, "unknown d
11510 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44  atabase: %s", zD
11520 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
11530 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
11540 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  .nBusy = 0;.    
11550 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63  rc = sqlite3Chec
11560 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20  kpoint(db, iDb, 
11570 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
11580 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ckpt);.    sqlit
11590 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
115a0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
115b0 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
115c0 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  c);..  /* If the
115d0 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
115e0 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 63 6c 65   statements, cle
115f0 61 72 20 74 68 65 20 69 6e 74 65 72 72 75 70 74  ar the interrupt
11600 20 66 6c 61 67 20 61 74 20 74 68 69 73 0a 20 20   flag at this.  
11610 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20  ** point.  */.  
11620 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
11630 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  ive==0 ){.    db
11640 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
11650 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73  ed = 0;.  }..  s
11660 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
11670 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
11680 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
11690 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  if.}.../*.** Che
116a0 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
116b0 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20   zDb. If zDb is 
116c0 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20  NULL, or if the 
116d0 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74  buffer zDb point
116e0 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73  s.** to contains
116f0 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73   a zero-length s
11700 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63  tring, all attac
11710 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
11720 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  e .** checkpoint
11730 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
11740 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
11750 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
11760 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
11770 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
11780 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33  F: R-41613-20553
11790 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
117a0 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29  _checkpoint(D,X)
117b0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
117c0 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77  o.  ** sqlite3_w
117d0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
117e0 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43  (D,X,SQLITE_CHEC
117f0 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30  KPOINT_PASSIVE,0
11800 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ,0). */.  return
11810 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
11820 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44  ckpoint_v2(db,zD
11830 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  b,SQLITE_CHECKPO
11840 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29  INT_PASSIVE,0,0)
11850 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
11860 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
11870 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f  ** Run a checkpo
11880 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  int on database 
11890 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e  iDb. This is a n
118a0 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65  o-op if database
118b0 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63   iDb is.** not c
118c0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e  urrently open in
118d0 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
118e0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
118f0 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  n is open on the
11900 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
11910 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68  checkpointed, th
11920 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
11930 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  returns SQLITE_L
11940 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63  OCKED and a chec
11950 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74  kpoint is not at
11960 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20  tempted. If .** 
11970 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
11980 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68  while running th
11990 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e  e checkpoint, an
119a0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
119b0 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
119c0 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f  ed (i.e. SQLITE_
119d0 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73  IOERR). Otherwis
119e0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
119f0 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e  .** The mutex on
11a00 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11a10 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65   db should be he
11a20 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ld by the caller
11a30 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61  . The mutex.** a
11a40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
11a50 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72  he specific b-tr
11a60 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  ee being checkpo
11a70 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62  inted is taken b
11a80 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  y.** this functi
11a90 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65  on while the che
11aa0 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69  ckpoint is runni
11ab0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ng..**.** If iDb
11ac0 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54   is passed SQLIT
11ad0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20  E_MAX_ATTACHED, 
11ae0 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  then all attache
11af0 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a  d databases are.
11b00 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
11b10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
11b20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
11b30 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
11b40 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61  iately -.** no a
11b50 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
11b60 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79  o checkpoint any
11b70 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62   remaining datab
11b80 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ases..**.** Para
11b90 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f  meter eMode is o
11ba0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45  ne of SQLITE_CHE
11bb0 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
11bc0 20 46 55 4c 4c 2c 20 52 45 53 54 41 52 54 0a 2a   FULL, RESTART.*
11bd0 2a 20 6f 72 20 54 52 55 4e 43 41 54 45 2e 0a 2a  * or TRUNCATE..*
11be0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
11bf0 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
11c00 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
11c10 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e  t eMode, int *pn
11c20 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74  Log, int *pnCkpt
11c30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11c40 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
11c50 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
11c60 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
11c90 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
11ca0 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73  ugh attached dbs
11cb0 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20   */.  int bBusy 
11cc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11cd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
11ce0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73   SQLITE_BUSY has
11cf0 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
11d00 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
11d10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11d20 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
11d30 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f  .  assert( !pnLo
11d40 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20  g || *pnLog==-1 
11d50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
11d60 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d  Ckpt || *pnCkpt=
11d70 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  =-1 );..  for(i=
11d80 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20  0; i<db->nDb && 
11d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
11da0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
11db0 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49  iDb || iDb==SQLI
11dc0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
11dd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
11de0 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70  lite3BtreeCheckp
11df0 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  oint(db->aDb[i].
11e00 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  pBt, eMode, pnLo
11e10 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
11e20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20    pnLog = 0;.   
11e30 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20     pnCkpt = 0;. 
11e40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11e50 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
11e60 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20      bBusy = 1;. 
11e70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11e80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
11e90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
11ea0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
11eb0 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51  K && bBusy) ? SQ
11ec0 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a  LITE_BUSY : rc;.
11ed0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11ee0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
11ef0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11f00 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65  ion returns true
11f10 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20   if main-memory 
11f20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69  should be used i
11f30 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74  nstead of.** a t
11f40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f  emporary file fo
11f50 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65  r transient page
11f60 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74  r files and stat
11f70 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  ement journals..
11f80 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
11f90 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  urned depends on
11fa0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62   the value of db
11fb0 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75  ->temp_store (ru
11fc0 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74  ntime.** paramet
11fd0 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  er) and the comp
11fe0 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f  ile time value o
11ff0 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
12000 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ORE. The.** foll
12010 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
12020 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69  ribes the relati
12030 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74  onship between t
12040 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a  hese two values.
12050 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ** and this func
12060 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c  tions return val
12070 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49  ue..**.**   SQLI
12080 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20  TE_TEMP_STORE   
12090 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
120a0 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66       Location of
120b0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
120c0 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ase.**   -------
120d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
120e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
120f0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
12100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12110 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
12120 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
12140 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
12150 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
12190 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
121c0 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
121d0 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31  return 1).**   1
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
12200 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
12210 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
12220 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
12230 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
12240 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
12250 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
12260 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
12270 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
12290 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
122a0 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  1).**   2       
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122d0 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
122e0 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20  rn 1).**   3    
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
12310 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
12320 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20  eturn 1).*/.int 
12330 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
12340 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65  ory(const sqlite
12350 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49  3 *db){.#if SQLI
12360 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31  TE_TEMP_STORE==1
12370 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
12380 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b  temp_store==2 );
12390 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
123a0 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
123b0 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
123c0 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b  temp_store!=1 );
123d0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
123e0 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33  TE_TEMP_STORE==3
123f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12400 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72  TER(db);.  retur
12410 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
12420 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
12430 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
12440 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55  MP_STORE>3.  UNU
12450 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
12460 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  );.  return 0;.#
12470 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
12480 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f  eturn UTF-8 enco
12490 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
124a0 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
124b0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
124c0 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
124d0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
124e0 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69  ite3_errmsg(sqli
124f0 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
12500 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28  t char *z;.  if(
12510 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
12520 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
12530 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  (SQLITE_NOMEM_BK
12540 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  PT);.  }.  if( !
12550 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12560 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
12570 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
12580 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
12590 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a  E_MISUSE_BKPT);.
125a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
125b0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
125c0 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
125d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
125e0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
125f0 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
12600 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c 73  EM_BKPT);.  }els
12610 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e{.    testcase(
12620 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a   db->pErr==0 );.
12630 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73      z = (char*)s
12640 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12650 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  t(db->pErr);.   
12660 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
12670 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
12680 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
12690 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
126a0 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
126b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
126c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
126d0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
126e0 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
126f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12700 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
12710 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63  eturn UTF-16 enc
12720 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
12730 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
12740 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
12750 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
12760 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
12770 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73  lite3_errmsg16(s
12780 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
12790 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
127a0 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20  outOfMem[] = {. 
127b0 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
127c0 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c  , ' ', 'o', 'f',
127d0 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20   ' ', 'm', 'e', 
127e0 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27  'm', 'o', 'r', '
127f0 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61  y', 0.  };.  sta
12800 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69  tic const u16 mi
12810 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  suse[] = {.    '
12820 62 27 2c 20 27 61 27 2c 20 27 64 27 2c 20 27 20  b', 'a', 'd', ' 
12830 27 2c 20 27 70 27 2c 20 27 61 27 2c 20 27 72 27  ', 'p', 'a', 'r'
12840 2c 20 27 61 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , 'a', 'm', 'e',
12850 20 27 74 27 2c 20 27 65 27 2c 20 27 72 27 2c 20   't', 'e', 'r', 
12860 27 20 27 2c 0a 20 20 20 20 27 6f 27 2c 20 27 72  ' ',.    'o', 'r
12870 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 74 27  ', ' ', 'o', 't'
12880 2c 20 27 68 27 2c 20 27 65 27 2c 20 27 72 27 2c  , 'h', 'e', 'r',
12890 20 27 20 27 2c 20 27 41 27 2c 20 27 50 27 2c 20   ' ', 'A', 'P', 
128a0 27 49 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6d  'I', ' ',.    'm
128b0 27 2c 20 27 69 27 2c 20 27 73 27 2c 20 27 75 27  ', 'i', 's', 'u'
128c0 2c 20 27 73 27 2c 20 27 65 27 2c 20 30 0a 20 20  , 's', 'e', 0.  
128d0 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  };..  const void
128e0 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
128f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
12900 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
12910 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
12920 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
12930 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
12940 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d  return (void *)m
12950 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  isuse;.  }.  sql
12960 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12970 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
12980 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
12990 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28  led ){.    z = (
129a0 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
129b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
129c0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
129d0 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
129e0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
129f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12a00 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
12a10 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c  db->errCode, sql
12a20 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
12a30 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  rrCode));.      
12a40 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
12a50 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
12a60 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  r);.    }.    /*
12a70 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
12a80 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
12a90 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
12aa0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12ab0 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  t16().    ** abo
12ac0 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ve. If this is t
12ad0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
12ae0 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
12af0 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f  ed flag needs to
12b00 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72  .    ** be clear
12b10 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
12b20 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72  ing. Do this dir
12b30 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
12b40 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c  f via.    ** sql
12b50 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74  ite3ApiExit(), t
12b60 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20  o avoid setting 
12b70 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
12b80 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  dle error messag
12b90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
12ba0 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72 28 64 62  lite3OomClear(db
12bb0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12bc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12bd0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
12be0 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
12bf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
12c00 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  16 */../*.** Ret
12c10 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
12c20 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67  ent error code g
12c30 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53  enerated by an S
12c40 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49  QLite routine. I
12c50 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73  f NULL is.** pas
12c60 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
12c70 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20  tion, we assume 
12c80 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  a malloc() faile
12c90 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  d during sqlite3
12ca0 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _open()..*/.int 
12cb0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
12cc0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
12cd0 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
12ce0 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
12cf0 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
12d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
12d10 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
12d20 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
12d30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12d40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12d50 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
12d60 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
12d70 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72  errCode & db->er
12d80 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rMask;.}.int sql
12d90 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
12da0 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
12db0 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
12dc0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
12dd0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
12de0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12df0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12e00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
12e10 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
12e20 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
12e30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12e40 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
12e50 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  n db->errCode;.}
12e60 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 73  .int sqlite3_sys
12e70 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c 69 74 65  tem_errno(sqlite
12e80 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
12e90 20 64 62 20 3f 20 64 62 2d 3e 69 53 79 73 45 72   db ? db->iSysEr
12ea0 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a 2f 2a  rno : 0;.}  ../*
12eb0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
12ec0 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
12ed0 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
12ee0 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
12ef0 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
12f00 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69  t.  For now, thi
12f10 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74  s simply calls t
12f20 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69  he internal sqli
12f30 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66  te3ErrStr().** f
12f40 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  unction..*/.cons
12f50 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
12f60 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a  errstr(int rc){.
12f70 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12f80 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f  ErrStr(rc);.}../
12f90 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
12fa0 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  w collating func
12fb0 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73  tion for databas
12fc0 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d  e "db".  The nam
12fd0 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e  e is zName.** an
12fe0 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  d the encoding i
12ff0 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  s enc..*/.static
13000 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61   int createColla
13010 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
13020 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   db,.  const cha
13030 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20  r *zName, .  u8 
13040 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74  enc,.  void* pCt
13050 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
13060 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
13070 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
13080 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
13090 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
130a0 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
130b0 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32  Coll;.  int enc2
130c0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
130d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
130e0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
130f0 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
13100 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
13110 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
13120 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
13130 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
13140 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
13150 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
13160 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
13170 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
13180 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
13190 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
131a0 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
131b0 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63  ally..  */.  enc
131c0 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63  2 = enc;.  testc
131d0 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
131e0 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73  E_UTF16 );.  tes
131f0 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
13200 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
13210 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  D );.  if( enc2=
13220 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c  =SQLITE_UTF16 ||
13230 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
13240 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20  F16_ALIGNED ){. 
13250 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45     enc2 = SQLITE
13260 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
13270 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c  }.  if( enc2<SQL
13280 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32  ITE_UTF8 || enc2
13290 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  >SQLITE_UTF16BE 
132a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
132b0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
132c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
132d0 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
132e0 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
132f0 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
13300 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
13310 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
13320 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
13330 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
13340 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
13350 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
13360 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
13370 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
13380 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
13390 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
133a0 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
133b0 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
133c0 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  nc2, zName, 0);.
133d0 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
133e0 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
133f0 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
13400 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
13410 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
13420 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
13430 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
13440 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
13450 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
13460 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
13470 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
13480 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
13490 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
134a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
134b0 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
134c0 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
134d0 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
134e0 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
134f0 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
13500 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
13510 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
13520 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
13530 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
13540 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
13550 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
13560 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
13570 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
13580 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
13590 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
135a0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
135b0 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
135c0 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
135d0 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
135e0 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
135f0 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
13600 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
13610 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
13620 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
13630 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
13640 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
13650 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
13660 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
13670 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  zName);.      in
13680 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
13690 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
136a0 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
136b0 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
136c0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
136d0 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
136e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
136f0 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
13700 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
13710 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
13720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
13730 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
13740 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13750 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
13760 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
13770 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
13780 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
13790 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
137a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
137b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 43 6f 6c  MEM_BKPT;.  pCol
137c0 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61  l->xCmp = xCompa
137d0 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73  re;.  pColl->pUs
137e0 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f  er = pCtx;.  pCo
137f0 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b  ll->xDel = xDel;
13800 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20  .  pColl->enc = 
13810 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63  (u8)(enc2 | (enc
13820 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f   & SQLITE_UTF16_
13830 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c  ALIGNED));.  sql
13840 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
13850 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75  LITE_OK);.  retu
13860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13870 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
13880 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
13890 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
138a0 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
138b0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
138c0 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
138d0 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
138e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
138f0 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
13900 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
13910 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
13920 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
13930 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13940 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
13950 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
13960 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
13970 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
13980 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
13990 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
139a0 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
139b0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
139c0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
139d0 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
139e0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
139f0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
13a00 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
13a10 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
13a20 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20  ARIABLE_NUMBER, 
13a30 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
13a40 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20  8091-32352 */.  
13a50 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
13a60 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  ER_DEPTH,.  SQLI
13a70 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
13a80 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  READS,.};../*.**
13a90 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68   Make sure the h
13aa0 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73  ard limits are s
13ab0 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65  et to reasonable
13ac0 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53   values.*/.#if S
13ad0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13ae0 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
13af0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d  ITE_MAX_LENGTH m
13b00 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
13b10 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
13b20 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
13b30 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
13b40 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
13b50 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
13b60 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
13b70 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13b80 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c  X_SQL_LENGTH>SQL
13b90 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
13ba0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13bb0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
13bc0 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72  t not be greater
13bd0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58   than SQLITE_MAX
13be0 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23  _LENGTH.#endif.#
13bf0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
13c00 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a  MPOUND_SELECT<2.
13c10 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13c20 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
13c30 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  CT must be at le
13c40 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66  ast 2.#endif.#if
13c50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
13c60 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53  _OP<40.# error S
13c70 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
13c80 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  P must be at lea
13c90 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66  st 40.#endif.#if
13ca0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
13cb0 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51  TION_ARG<0 || SQ
13cc0 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
13cd0 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65 72 72 6f  N_ARG>127.# erro
13ce0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
13cf0 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
13d00 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
13d10 31 32 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  127.#endif.#if S
13d20 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13d30 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
13d40 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a  AX_ATTACHED>125.
13d50 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13d60 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
13d70 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
13d80 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66  d 125.#endif.#if
13d90 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
13da0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c  _PATTERN_LENGTH<
13db0 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
13dc0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
13dd0 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  N_LENGTH must be
13de0 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
13df0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13e00 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23  X_COLUMN>32767.#
13e10 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13e20 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f  X_COLUMN must no
13e30 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23  t exceed 32767.#
13e40 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13e50 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
13e60 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
13e70 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
13e80 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74  DEPTH must be at
13e90 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
13ea0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
13eb0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20  ORKER_THREADS<0 
13ec0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  || SQLITE_MAX_WO
13ed0 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a  RKER_THREADS>50.
13ee0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13ef0 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
13f00 53 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  S must be betwee
13f10 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69  n 0 and 50.#endi
13f20 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
13f30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
13f40 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74  limit.  Report t
13f50 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a  he old value..**
13f60 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c   If an invalid l
13f70 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75  imit index is su
13f80 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d  pplied, report -
13f90 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  1..** Make no ch
13fa0 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20  anges but still 
13fb0 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  report the old v
13fc0 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  alue if the.** n
13fd0 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  ew limit is nega
13fe0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  tive..**.** A ne
13ff0 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f  w lower limit do
14000 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78  es not shrink ex
14010 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74  isting construct
14020 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  s..** It merely 
14030 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e  prevents new con
14040 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63  structs that exc
14050 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a  eed the limit.**
14060 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a   from forming..*
14070 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  /.int sqlite3_li
14080 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
14090 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e   int limitId, in
140a0 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69  t newLimit){.  i
140b0 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69  nt oldLimit;..#i
140c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
140d0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
140e0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
140f0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
14100 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
14110 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
14120 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
14130 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56  .#endif..  /* EV
14140 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31  IDENCE-OF: R-301
14150 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63  89-54097 For eac
14160 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79  h limit category
14170 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41   SQLITE_LIMIT_NA
14180 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ME.  ** there is
14190 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f   a hard upper bo
141a0 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69  und set at compi
141b0 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70  le-time by a C p
141c0 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a  reprocessor.  **
141d0 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51   macro called SQ
141e0 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28  LITE_MAX_NAME. (
141f0 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e  The "_LIMIT_" in
14200 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61   the name is cha
14210 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d  nged to.  ** "_M
14220 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73  AX_".).  */.  as
14230 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
14240 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
14250 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
14260 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  X_LENGTH );.  as
14270 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
14280 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  [SQLITE_LIMIT_SQ
14290 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  L_LENGTH]==SQLIT
142a0 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
142b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
142c0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
142d0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53  LIMIT_COLUMN]==S
142e0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
142f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
14300 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
14310 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
14320 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  ]==SQLITE_MAX_EX
14330 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  PR_DEPTH );.  as
14340 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
14350 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
14360 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d  MPOUND_SELECT]==
14370 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
14380 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61  UND_SELECT);.  a
14390 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
143a0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
143b0 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f  DBE_OP]==SQLITE_
143c0 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20  MAX_VDBE_OP );. 
143d0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
143e0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
143f0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d  _FUNCTION_ARG]==
14400 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
14410 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73  ION_ARG );.  ass
14420 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14430 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
14440 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ACHED]==SQLITE_M
14450 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20  AX_ATTACHED );. 
14460 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14470 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14480 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
14490 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20  NGTH]==.        
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
144d0 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
144e0 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
144f0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
14500 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
14510 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c  BLE_NUMBER]==SQL
14520 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
14530 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65  _NUMBER);.  asse
14540 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
14550 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
14560 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  GER_DEPTH]==SQLI
14570 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
14580 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
14590 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
145a0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
145b0 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54  _THREADS]==SQLIT
145c0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
145d0 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74  EADS );.  assert
145e0 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  ( SQLITE_LIMIT_W
145f0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28  ORKER_THREADS==(
14600 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31  SQLITE_N_LIMIT-1
14610 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d  ) );...  if( lim
14620 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49  itId<0 || limitI
14630 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  d>=SQLITE_N_LIMI
14640 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
14650 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d  -1;.  }.  oldLim
14660 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  it = db->aLimit[
14670 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20  limitId];.  if( 
14680 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20  newLimit>=0 ){  
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36   /* IMP: R-52476
146b0 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66  -28732 */.    if
146c0 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64  ( newLimit>aHard
146d0 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29  Limit[limitId] )
146e0 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74  {.      newLimit
146f0 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69   = aHardLimit[li
14700 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a  mitId];  /* IMP:
14710 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a   R-51463-25634 *
14720 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  /.    }.    db->
14730 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
14740 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
14750 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
14760 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
14770 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
14780 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a  -53341-35419 */.
14790 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  }.#if defined(SQ
147a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f  LITE_ENABLE_AUTO
147b0 5f 50 52 4f 46 49 4c 45 29 0a 2f 2a 20 73 74 64  _PROFILE)./* std
147c0 65 72 72 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a 76  err logging */.v
147d0 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  oid _sqlite_auto
147e0 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64 20 2a 61  _profile(void *a
147f0 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
14800 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f  sql, u64 ns);.vo
14810 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  id _sqlite_auto_
14820 74 72 61 63 65 28 76 6f 69 64 20 2a 61 75 78 2c  trace(void *aux,
14830 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
14840 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  );.void _sqlite_
14850 61 75 74 6f 5f 70 72 6f 66 69 6c 65 28 76 6f 69  auto_profile(voi
14860 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68  d *aux, const ch
14870 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29  ar *sql, u64 ns)
14880 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e 75 73 65   {.#pragma unuse
14890 64 28 61 75 78 29 0a 09 66 70 72 69 6e 74 66 28  d(aux)..fprintf(
148a0 73 74 64 65 72 72 2c 20 22 51 75 65 72 79 3a 20  stderr, "Query: 
148b0 25 73 5c 6e 20 45 78 65 63 75 74 69 6f 6e 20 54  %s\n Execution T
148c0 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c  ime: %llu ms\n",
148d0 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30 30 30 30   sql, ns / 10000
148e0 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c  00);.}.void _sql
148f0 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28 76  ite_auto_trace(v
14900 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
14910 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a 09 66 70  char *sql) {..fp
14920 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54  rintf(stderr, "T
14930 72 61 63 65 53 51 4c 28 25 70 29 3a 20 25 73 5c  raceSQL(%p): %s\
14940 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29 3b 0a 7d  n", aux, sql);.}
14950 0a 0a 2f 2a 20 73 79 73 6c 6f 67 20 6c 6f 67 67  ../* syslog logg
14960 69 6e 67 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ing */.#include 
14970 3c 61 73 6c 2e 68 3e 0a 73 74 61 74 69 63 20 61  <asl.h>.static a
14980 73 6c 63 6c 69 65 6e 74 20 61 75 74 6f 6c 6f 67  slclient autolog
14990 5f 63 6c 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a  _client = NULL;.
149a0 73 74 61 74 69 63 20 76 6f 69 64 20 5f 63 6c 6f  static void _clo
149b0 73 65 5f 61 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20  se_asl_log() {. 
149c0 20 69 66 28 20 4e 55 4c 4c 21 3d 61 75 74 6f 6c   if( NULL!=autol
149d0 6f 67 5f 63 6c 69 65 6e 74 20 29 7b 0a 20 20 20  og_client ){.   
149e0 20 61 73 6c 5f 63 6c 6f 73 65 28 61 75 74 6f 6c   asl_close(autol
149f0 6f 67 5f 63 6c 69 65 6e 74 29 3b 0a 20 20 20 20  og_client);.    
14a00 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d  autolog_client =
14a10 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 73 74 61   NULL;.  }.}.sta
14a20 74 69 63 20 76 6f 69 64 20 5f 6f 70 65 6e 5f 61  tic void _open_a
14a30 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20 20 69 66 28  sl_log() {.  if(
14a40 20 4e 55 4c 4c 3d 3d 61 75 74 6f 6c 6f 67 5f 63   NULL==autolog_c
14a50 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20 61 75 74  lient ){.    aut
14a60 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20 61 73  olog_client = as
14a70 6c 5f 6f 70 65 6e 28 22 53 51 4c 69 74 65 22 2c  l_open("SQLite",
14a80 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 61   NULL, 0);.    a
14a90 74 65 78 69 74 28 5f 63 6c 6f 73 65 5f 61 73 6c  texit(_close_asl
14aa0 5f 6c 6f 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f  _log);.  }.}..vo
14ab0 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  id _sqlite_auto_
14ac0 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 28 76  profile_syslog(v
14ad0 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
14ae0 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e  char *sql, u64 n
14af0 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  s);.void _sqlite
14b00 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c  _auto_trace_sysl
14b10 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f  og(void *aux, co
14b20 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29 3b 0a  nst char *sql);.
14b30 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
14b40 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67  o_profile_syslog
14b50 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73  (void *aux, cons
14b60 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34  t char *sql, u64
14b70 20 6e 73 29 20 7b 0a 23 70 72 61 67 6d 61 20 75   ns) {.#pragma u
14b80 6e 75 73 65 64 28 61 75 78 29 0a 09 61 73 6c 5f  nused(aux)..asl_
14b90 6c 6f 67 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  log(autolog_clie
14ba0 6e 74 2c 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45  nt, NULL, ASL_LE
14bb0 56 45 4c 5f 4e 4f 54 49 43 45 2c 20 22 51 75 65  VEL_NOTICE, "Que
14bc0 72 79 3a 20 25 73 5c 6e 20 45 78 65 63 75 74 69  ry: %s\n Executi
14bd0 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c 75 20 6d 73  on Time: %llu ms
14be0 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73 20 2f 20 31  \n", sql, ns / 1
14bf0 30 30 30 30 30 30 29 3b 0a 7d 0a 76 6f 69 64 20  000000);.}.void 
14c00 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61  _sqlite_auto_tra
14c10 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a  ce_syslog(void *
14c20 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  aux, const char 
14c30 2a 73 71 6c 29 20 7b 0a 09 61 73 6c 5f 6c 6f 67  *sql) {..asl_log
14c40 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c  (autolog_client,
14c50 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c   NULL, ASL_LEVEL
14c60 5f 4e 4f 54 49 43 45 2c 20 22 54 72 61 63 65 53  _NOTICE, "TraceS
14c70 51 4c 28 25 70 29 3a 20 25 73 5c 6e 22 2c 20 61  QL(%p): %s\n", a
14c80 75 78 2c 20 73 71 6c 29 3b 0a 7d 0a 23 65 6e 64  ux, sql);.}.#end
14c90 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
14ca0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
14cb0 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52  to parse both UR
14cc0 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66  Is and non-URI f
14cd0 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20  ilenames passed 
14ce0 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74  by the.** user t
14cf0 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20  o API functions 
14d00 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f  sqlite3_open() o
14d10 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
14d20 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74  2(), and for dat
14d30 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70  abase.** URIs sp
14d40 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
14d50 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d  of ATTACH statem
14d60 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
14d70 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
14d80 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
14d90 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
14da0 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f  he VFS to use (o
14db0 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73  r.** a NULL to s
14dc0 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75  ignify the defau
14dd0 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55  lt VFS) if the U
14de0 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  RI does not cont
14df0 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a  ain a "vfs=xxx".
14e00 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
14e10 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  er. The second a
14e20 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
14e30 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e   the URI (or non
14e40 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a  -URI filename).*
14e50 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74  * itself. When t
14e60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14e70 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61  called the *pFla
14e80 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  gs variable shou
14e90 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68  ld contain.** th
14ea0 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20  e default flags 
14eb0 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
14ec0 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68  base handle with
14ed0 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72  . The value stor
14ee0 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73  ed in.** *pFlags
14ef0 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20   may be updated 
14f00 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
14f10 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65   if the URI file
14f20 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a  name contains .*
14f30 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72  * "cache=xxx" or
14f40 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72   "mode=xxx" quer
14f50 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a  y parameters..**
14f60 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
14f70 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
14f80 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
14f90 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73  s case *ppVfs is
14fa0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
14fb0 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74  .** the VFS that
14fc0 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
14fd0 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
14fe0 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69  base file. *pzFi
14ff0 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  le is set to.** 
15000 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
15010 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
15020 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
15030 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73  e to open. It is
15040 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
15050 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
15060 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
15070 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  lly call sqlite3
15080 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
15090 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
150a0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
150b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
150c0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
150d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
150e0 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67  ed and *pzErrMsg
150f0 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74  .** may be set t
15100 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
15110 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
15120 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
15130 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  ge error .** mes
15140 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
15150 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
15160 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
15170 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
15180 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
15190 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  r by calling sql
151a0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
151b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65  int sqlite3Parse
151c0 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  Uri(.  const cha
151d0 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20  r *zDefaultVfs, 
151e0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f         /* VFS to
151f0 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d   use if no "vfs=
15200 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f  xxx" query optio
15210 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
15220 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20  r *zUri,        
15230 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
15240 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20  rminated URI to 
15250 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  parse */.  unsig
15260 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  ned int *pFlags,
15270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
15280 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45  /OUT: SQLITE_OPE
15290 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  N_XXX flags */. 
152a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70   sqlite3_vfs **p
152b0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
152c0 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20   /* OUT: VFS to 
152d0 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a  use */ .  char *
152e0 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20  *pzFile,        
152f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
15300 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f  : Filename compo
15310 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20  nent of URI */. 
15320 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
15350 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53  essage (if rc!=S
15360 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a  QLITE_OK) */.){.
15370 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15380 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
15390 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46   int flags = *pF
153a0 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lags;.  const ch
153b0 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61  ar *zVfs = zDefa
153c0 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a  ultVfs;.  char *
153d0 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b  zFile;.  char c;
153e0 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71  .  int nUri = sq
153f0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
15400 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ri);..  assert( 
15410 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a  *pzErrMsg==0 );.
15420 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26  .  if( ((flags &
15430 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
15440 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  )             /*
15450 20 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33 32   IMP: R-48725-32
15460 32 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  206 */.         
15470 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f     || sqlite3Glo
15480 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
15490 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ri) /* IMP: R-51
154a0 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20  689-46548 */.   
154b0 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65  && nUri>=5 && me
154c0 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65  mcmp(zUri, "file
154d0 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50  :", 5)==0 /* IMP
154e0 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20  : R-57884-37496 
154f0 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  */.  ){.    char
15500 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20   *zOpt;.    int 
15510 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
15520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
15530 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70  ser state when p
15540 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20  arsing URI */.  
15550 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20    int iIn;      
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74  /* Input charact
15580 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
15590 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155b0 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65   Output characte
155c0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75  r index */.    u
155d0 36 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b  64 nByte = nUri+
155e0 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
155f0 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
15600 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
15610 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
15620 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
15630 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20  URI flag is set 
15640 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74  to indicate to t
15650 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20  he VFS xOpen .  
15660 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74    ** method that
15670 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78   there may be ex
15680 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66  tra parameters f
15690 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c  ollowing the fil
156a0 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e-name.  */.    
156b0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
156c0 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66  OPEN_URI;..    f
156d0 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55  or(iIn=0; iIn<nU
156e0 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65  ri; iIn++) nByte
156f0 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d   += (zUri[iIn]==
15700 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  '&');.    zFile 
15710 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
15720 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  64(nByte);.    i
15730 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
15740 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
15750 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49 6e 20 3d  BKPT;..    iIn =
15760 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   5;.#ifdef SQLIT
15770 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48  E_ALLOW_URI_AUTH
15780 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20 73 74  ORITY.    if( st
15790 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f  rncmp(zUri+5, "/
157a0 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  //", 3)==0 ){.  
157b0 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
157c0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
157d0 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61  ing condition ca
157e0 75 73 65 73 20 55 52 49 73 20 77 69 74 68 20 66  uses URIs with f
157f0 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68  ive leading / ch
15800 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a  aracters.      *
15810 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f  * like file:////
15820 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65  /host/path to be
15830 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
15840 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74  UNCs like //host
15850 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  /path..      ** 
15860 54 68 65 20 63 6f 72 72 65 63 74 20 55 52 49 20  The correct URI 
15870 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61 73  for that UNC has
15880 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75   only two or fou
15890 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72  r leading / char
158a0 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  acters.      ** 
158b0 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68  file://host/path
158c0 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73   or file:////hos
158d0 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c  t/path.  But 5 l
158e0 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69  eading slashes i
158f0 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  s a .      ** co
15900 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61  mmon error, we a
15910 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68  re told, so we h
15920 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73 70  andle it as a sp
15930 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20  ecial case. */. 
15940 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
15950 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20  (zUri+7, "///", 
15960 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20  3)==0 ){ iIn++; 
15970 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
15980 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20  strncmp(zUri+5, 
15990 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20  "//localhost/", 
159a0 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  12)==0 ){.      
159b0 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a  iIn = 16;.    }.
159c0 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69 73  #else.    /* Dis
159d0 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
159e0 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
159f0 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
15a00 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
15a10 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
15a20 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
15a30 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
15a40 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
15a50 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
15a60 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='/' ) iIn++;. 
15a70 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
15a80 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
15a90 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
15aa0 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
15ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
15ac0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
15ad0 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
15ae0 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
15af0 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
15b00 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
15b10 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
15b20 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15b30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
15b40 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
15b50 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
15b60 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  f..    /* Copy t
15b70 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
15b80 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65  any query parame
15b90 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46  ters into the zF
15ba0 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20  ile buffer. .   
15bb0 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65   ** Decode %HH e
15bc0 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e  scape codes alon
15bd0 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20  g the way. .    
15be0 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e  **.    ** Within
15bf0 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69   this loop, vari
15c00 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20  able eState may 
15c10 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f  be set to 0, 1 o
15c20 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20  r 2, depending. 
15c30 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72     ** on the par
15c40 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73  sing context. As
15c50 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
15c60 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72  .    **   0: Par
15c70 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a  sing file-name..
15c80 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73      **   1: Pars
15c90 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e  ing name section
15ca0 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
15cb0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
15cc0 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61  ..    **   2: Pa
15cd0 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74  rsing value sect
15ce0 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
15cf0 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
15d00 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ter..    */.    
15d10 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
15d20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
15d30 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
15d40 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '#' ){.      iIn
15d50 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
15d60 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20  ='%' .       && 
15d70 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
15d80 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20  zUri[iIn]) .    
15d90 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
15da0 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31  digit(zUri[iIn+1
15db0 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ]) .      ){.   
15dc0 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d       int octet =
15dd0 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e   (sqlite3HexToIn
15de0 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c  t(zUri[iIn++]) <
15df0 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63  < 4);.        oc
15e00 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65  tet += sqlite3He
15e10 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
15e20 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  +]);..        as
15e30 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26  sert( octet>=0 &
15e40 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20  & octet<256 );. 
15e50 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74         if( octet
15e60 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
15e70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 52 49  QLITE_ENABLE_URI
15e80 5f 30 30 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  _00_ERROR.      
15e90 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
15ea0 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
15eb0 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
15ec0 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
15ed0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
15ee0 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
15ef0 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
15f00 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
15f10 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
15f20 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
15f30 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
15f40 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
15f50 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
15f60 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
15f70 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
15f80 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
15f90 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
15fa0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
15fb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
15fc0 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
15fd0 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
15fe0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15ff0 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
16000 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
16010 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
16020 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
16030 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
16040 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
16050 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
16060 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
16070 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
16080 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
16090 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
160a0 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  e;.#else.       
160b0 20 20 20 2f 2a 20 49 66 20 45 4e 41 42 4c 45 5f     /* If ENABLE_
160c0 55 52 49 5f 30 30 5f 45 52 52 4f 52 20 69 73 20  URI_00_ERROR is 
160d0 64 65 66 69 6e 65 64 2c 20 22 25 30 30 22 20 69  defined, "%00" i
160e0 6e 20 61 20 55 52 49 20 69 73 20 61 6e 20 65 72  n a URI is an er
160f0 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ror. */.        
16100 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
16110 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75  lite3_mprintf("u
16120 6e 65 78 70 65 63 74 65 64 20 25 25 30 30 20 69  nexpected %%00 i
16130 6e 20 75 72 69 22 29 3b 0a 20 20 20 20 20 20 20  n uri");.       
16140 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
16150 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
16160 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
16170 75 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ut;.#endif.     
16180 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
16190 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65   octet;.      }e
161a0 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d  lse if( eState==
161b0 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20  1 && (c=='&' || 
161c0 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  c=='=') ){.     
161d0 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75     if( zFile[iOu
161e0 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1]==0 ){.     
161f0 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79       /* An empty
16200 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67   option name. Ig
16210 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
16220 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a   altogether. */.
16230 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
16240 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
16250 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20  ri[iIn]!='#' && 
16260 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27  zUri[iIn-1]!='&'
16270 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
16280 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
162a0 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20  if( c=='&' ){.  
162b0 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f          zFile[iO
162c0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
162d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
162e0 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
162f0 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
16300 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
16310 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74    }else if( (eSt
16320 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27  ate==0 && c=='?'
16330 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20  ) || (eState==2 
16340 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20  && c=='&') ){.  
16350 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
16360 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b       eState = 1;
16370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
16380 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63  File[iOut++] = c
16390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
163a0 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c  eState==1 ) zFil
163b0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
163c0 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
163d0 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
163e0 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
163f0 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  '\0';..    /* Ch
16400 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72  eck if there wer
16410 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70  e any options sp
16420 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f  ecified that sho
16430 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74  uld be interpret
16440 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e  ed .    ** here.
16450 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72   Options that ar
16460 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65  e interpreted he
16470 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22  re include "vfs"
16480 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a   and those that.
16490 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
164a0 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20  d to flags that 
164b0 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f  may be passed to
164c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65   the sqlite3_ope
164d0 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65  n_v2().    ** me
164e0 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70  thod. */.    zOp
164f0 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74  t = &zFile[sqlit
16500 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
16510 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
16520 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20   zOpt[0] ){.    
16530 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c    int nOpt = sql
16540 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
16550 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t);.      char *
16560 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70  zVal = &zOpt[nOp
16570 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  t+1];.      int 
16580 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nVal = sqlite3St
16590 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20  rlen30(zVal);.. 
165a0 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33       if( nOpt==3
165b0 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22   && memcmp("vfs"
165c0 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b  , zOpt, 3)==0 ){
165d0 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20  .        zVfs = 
165e0 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  zVal;.      }els
165f0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
16600 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20  t OpenMode {.   
16610 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
16620 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  r *z;.          
16630 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  int mode;.      
16640 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a    } *aMode = 0;.
16650 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
16660 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20  odeType = 0;.   
16670 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
16680 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
16690 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  imit = 0;..     
166a0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26     if( nOpt==5 &
166b0 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22  & memcmp("cache"
166c0 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b  , zOpt, 5)==0 ){
166d0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
166e0 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
166f0 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d  e aCacheMode[] =
16700 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
16710 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49   "shared",  SQLI
16720 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
16730 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
16740 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20     { "private", 
16750 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
16760 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
16770 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
16780 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
16790 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
167a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
167b0 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f  EDCACHE|SQLITE_O
167c0 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
167d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
167e0 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a  e = aCacheMode;.
167f0 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
16800 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  = mask;.        
16810 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63    zModeType = "c
16820 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d  ache";.        }
16830 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
16840 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==4 && memcmp("
16850 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d  mode", zOpt, 4)=
16860 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16870 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
16880 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65  enMode aOpenMode
16890 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
168a0 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49     { "ro",  SQLI
168b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
168c0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
168d0 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f  { "rw",  SQLITE_
168e0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d  OPEN_READWRITE }
168f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  , .            {
16900 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f   "rwc", SQLITE_O
16910 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
16920 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16930 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  TE },.          
16940 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51    { "memory", SQ
16950 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
16960 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
16970 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
16980 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
16990 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
169a0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53  PEN_READONLY | S
169b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
169c0 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
169d0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
169e0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
169f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
16a00 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  Y;.          aMo
16a10 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a  de = aOpenMode;.
16a20 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
16a30 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a  = mask & flags;.
16a40 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
16a50 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a  ype = "access";.
16a60 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
16a70 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a     if( aMode ){.
16a80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
16a90 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
16aa0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
16ab0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64     for(i=0; aMod
16ac0 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20  e[i].z; i++){.  
16ad0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
16ae0 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b  char *z = aMode[
16af0 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  i].z;.          
16b00 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69    if( nVal==sqli
16b10 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26  te3Strlen30(z) &
16b20 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c  & 0==memcmp(zVal
16b30 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20  , z, nVal) ){.  
16b40 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
16b50 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65   = aMode[i].mode
16b60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16b70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
16b80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
16b90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
16ba0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
16bb0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
16bc0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
16bd0 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f  f("no such %s mo
16be0 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79  de: %s", zModeTy
16bf0 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
16c00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
16c10 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
16c20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
16c30 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
16c40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16c50 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c  if( (mode & ~SQL
16c60 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
16c70 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
16c80 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
16c90 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
16ca0 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61  f("%s mode not a
16cb0 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20  llowed: %s",.   
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ce0 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20       zModeType, 
16cf0 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
16d00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
16d10 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERM;.           
16d20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
16d30 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
16d40 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
16d50 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73   = (flags & ~mas
16d60 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20  k) | mode;.     
16d70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
16d80 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c      zOpt = &zVal
16d90 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a  [nVal+1];.    }.
16da0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46  .  }else{.    zF
16db0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
16dc0 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b 0a  lloc64(nUri+2);.
16dd0 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
16de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16df0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 69  OMEM_BKPT;.    i
16e00 66 28 20 6e 55 72 69 20 29 7b 0a 20 20 20 20 20  f( nUri ){.     
16e10 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a   memcpy(zFile, z
16e20 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
16e30 7d 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  }.    zFile[nUri
16e40 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
16e50 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c  ile[nUri+1] = '\
16e60 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  0';.    flags &=
16e70 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
16e80 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73  I;.  }..  *ppVfs
16e90 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
16ea0 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
16eb0 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20   *ppVfs==0 ){.  
16ec0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
16ed0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
16ee0 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
16ef0 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d   zVfs);.    rc =
16f00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16f10 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75   }. parse_uri_ou
16f20 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
16f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
16f40 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
16f50 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30  );.    zFile = 0
16f60 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20  ;.  }.  *pFlags 
16f70 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69  = flags;.  *pzFi
16f80 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65  le = zFile;.  re
16f90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
16fa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
16fb0 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
16fc0 4c 45 29 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  LE).#define SQLI
16fd0 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
16fe0 54 44 45 52 52 20 31 0a 23 64 65 66 69 6e 65 20  TDERR 1.#define 
16ff0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
17000 4e 47 5f 53 59 53 4c 4f 47 20 32 0a 73 74 61 74  NG_SYSLOG 2.stat
17010 69 63 20 76 6f 69 64 20 65 6e 61 62 6c 65 41 75  ic void enableAu
17020 74 6f 4c 6f 67 67 69 6e 67 28 0a 20 20 73 71 6c  toLogging(.  sql
17030 69 74 65 33 20 2a 64 62 0a 29 7b 0a 20 20 63 68  ite3 *db.){.  ch
17040 61 72 20 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d  ar *envprofile =
17050 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
17060 41 55 54 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a  AUTO_PROFILE");.
17070 20 20 0a 20 20 69 66 28 20 65 6e 76 70 72 6f 66    .  if( envprof
17080 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ile!=NULL ){.   
17090 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b 0a   int where = 0;.
170a0 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61 73      if( !strncas
170b0 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 70 72 6f  ecmp("1", envpro
170c0 66 69 6c 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  file, 1) ){.    
170d0 20 20 69 66 28 20 69 73 61 74 74 79 28 32 29 20    if( isatty(2) 
170e0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ){.        where
170f0 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f   = SQLITE_AUTOLO
17100 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20  GGING_STDERR;.  
17110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17120 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
17130 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
17140 53 4c 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SLOG;.      }.  
17150 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74    } else if( !st
17160 72 6e 63 61 73 65 63 6d 70 28 22 73 74 64 65 72  rncasecmp("stder
17170 72 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20  r", envprofile, 
17180 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  6) ){.      wher
17190 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  e = SQLITE_AUTOL
171a0 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20  OGGING_STDERR;. 
171b0 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73     } else if( !s
171c0 74 72 6e 63 61 73 65 63 6d 70 28 22 73 79 73 6c  trncasecmp("sysl
171d0 6f 67 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c  og", envprofile,
171e0 20 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65   6) ){.      whe
171f0 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f  re = SQLITE_AUTO
17200 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a  LOGGING_SYSLOG;.
17210 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 68      }.    if( wh
17220 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f  ere==SQLITE_AUTO
17230 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 29  LOGGING_STDERR )
17240 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
17250 70 72 6f 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c  profile(db, _sql
17260 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65  ite_auto_profile
17270 2c 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , db);.    }else
17280 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49   if( where==SQLI
17290 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
172a0 59 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f  YSLOG ){.      _
172b0 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a  open_asl_log();.
172c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
172d0 6f 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74  ofile(db, _sqlit
172e0 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73  e_auto_profile_s
172f0 79 73 6c 6f 67 2c 20 64 62 29 3b 0a 20 20 20 20  yslog, db);.    
17300 7d 0a 20 20 7d 0a 20 20 63 68 61 72 20 2a 65 6e  }.  }.  char *en
17310 76 74 72 61 63 65 20 3d 20 67 65 74 65 6e 76 28  vtrace = getenv(
17320 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 54 52 41  "SQLITE_AUTO_TRA
17330 43 45 22 29 3b 0a 20 20 69 66 28 20 65 6e 76 74  CE");.  if( envt
17340 72 61 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  race!=NULL ){.  
17350 20 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b    int where = 0;
17360 0a 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61  .    if( !strnca
17370 73 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 74 72  secmp("1", envtr
17380 61 63 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  ace, 1) ){.     
17390 20 69 66 28 20 69 73 61 74 74 79 28 32 29 20 29   if( isatty(2) )
173a0 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20  {.        where 
173b0 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47  = SQLITE_AUTOLOG
173c0 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20  GING_STDERR;.   
173d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
173e0 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
173f0 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53  _AUTOLOGGING_SYS
17400 4c 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LOG;.      }.   
17410 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72   } else if( !str
17420 6e 63 61 73 65 63 6d 70 28 22 73 74 64 65 72 72  ncasecmp("stderr
17430 22 2c 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20  ", envtrace, 6) 
17440 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d  ){.      where =
17450 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47   SQLITE_AUTOLOGG
17460 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20  ING_STDERR;.    
17470 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e  } else if( !strn
17480 63 61 73 65 63 6d 70 28 22 73 79 73 6c 6f 67 22  casecmp("syslog"
17490 2c 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20 29  , envtrace, 6) )
174a0 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20  {.      where = 
174b0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
174c0 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d  NG_SYSLOG;.    }
174d0 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d  .    if( where==
174e0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
174f0 4e 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20  NG_STDERR ){.   
17500 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
17510 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74  (db, _sqlite_aut
17520 6f 5f 74 72 61 63 65 2c 20 64 62 29 3b 0a 20 20  o_trace, db);.  
17530 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
17540 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f  e==SQLITE_AUTOLO
17550 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20 29 7b 0a  GGING_SYSLOG ){.
17560 20 20 20 20 20 20 5f 6f 70 65 6e 5f 61 73 6c 5f        _open_asl_
17570 6c 6f 67 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  log();.      sql
17580 69 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f  ite3_trace(db, _
17590 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63  sqlite_auto_trac
175a0 65 5f 73 79 73 6c 6f 67 2c 20 64 62 29 3b 0a 20  e_syslog, db);. 
175b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
175c0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
175d0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
175e0 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
175f0 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
17600 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
17610 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
17620 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
17630 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17640 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
17650 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
17660 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
17670 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
17680 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
17690 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
176a0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
176b0 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
176c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
176d0 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
176e0 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
176f0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
17700 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
17710 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
17720 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
17730 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17740 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
17750 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
17760 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
17770 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
17780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17790 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
177a0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
177b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
177c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177d0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
177e0 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
177f0 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
17800 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
17810 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
17820 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
17830 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
17840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17850 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
17860 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
17870 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
17880 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
178a0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
178b0 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
178c0 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ri() */..#ifdef 
178d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
178e0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
178f0 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
17900 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
17910 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
17920 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
17930 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
17940 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
17950 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
17960 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
17970 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
17980 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
17990 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
179a0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
179b0 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
179c0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
179d0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
179e0 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
179f0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
17a00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
17a10 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
17a20 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
17a30 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
17a40 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
17a50 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
17a60 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17a70 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
17a80 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
17a90 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  & SQLITE_OPEN_PR
17aa0 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20  IVATECACHE ){.  
17ab0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
17ac0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
17ad0 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CHE;.  }else if(
17ae0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
17af0 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
17b00 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66  Enabled ){.    f
17b10 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
17b20 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
17b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
17b40 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66  e harmful bits f
17b50 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61  rom the flags pa
17b60 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a  rameter.  **.  *
17b70 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  * The SQLITE_OPE
17b80 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51  N_NOMUTEX and SQ
17b90 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
17ba0 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20  TEX flags were. 
17bb0 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69   ** dealt with i
17bc0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
17bd0 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69  ode block.  Besi
17be0 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f  des these, the o
17bf0 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69  nly.  ** valid i
17c00 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73  nput flags for s
17c10 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
17c20 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   are SQLITE_OPEN
17c30 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20  _READONLY,.  ** 
17c40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17c50 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  WRITE, SQLITE_OP
17c60 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54  EN_CREATE, SQLIT
17c70 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
17c80 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  HE,.  ** SQLITE_
17c90 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
17ca0 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65  E, and some rese
17cb0 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65  rved bits.  Sile
17cc0 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
17cd0 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
17ce0 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
17cf0 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
17d00 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
17d10 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
17d20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
17d30 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
17d40 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17d50 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17d70 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
17d80 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
17d90 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17da0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
17db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17dc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
17dd0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
17de0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17df0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
17e00 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
17e10 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17e20 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17e40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
17e50 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
17e60 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17e70 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
17e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17e90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
17ea0 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
17eb0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
17ec0 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
17ed0 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
17ee0 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
17ef0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
17f00 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
17f10 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
17f20 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
17f30 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
17f40 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17f50 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
17f60 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74  e ){.    db->mut
17f70 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
17f80 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
17f90 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
17fa0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65      if( db->mute
17fb0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x==0 ){.      sq
17fc0 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
17fd0 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20        db = 0;.  
17fe0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
17ff0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
18000 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
18010 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
18020 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
18030 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62   0xff;.  db->nDb
18040 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69   = 2;.  db->magi
18050 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
18060 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62  _BUSY;.  db->aDb
18070 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
18080 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ;..  assert( siz
18090 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d  eof(db->aLimit)=
180a0 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d  =sizeof(aHardLim
180b0 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  it) );.  memcpy(
180c0 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72  db->aLimit, aHar
180d0 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64  dLimit, sizeof(d
180e0 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64  b->aLimit));.  d
180f0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
18100 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
18110 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f  READS] = SQLITE_
18120 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54  DEFAULT_WORKER_T
18130 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75  HREADS;.  db->au
18140 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
18150 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
18160 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d  = -1;.  db->szMm
18170 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ap = sqlite3Glob
18180 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
18190 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  .  db->nextPages
181a0 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  ize = 0;.  db->n
181b0 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
181c0 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62  0x7FFFFFFF;.  db
181d0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
181e0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20  E_ShortColNames 
181f0 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
18200 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f  rigger | SQLITE_
18210 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21  CacheSpill.#if !
18220 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
18230 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
18240 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54  _INDEX) || SQLIT
18250 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
18260 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20  TIC_INDEX.      
18270 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
18280 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65  ITE_AutoIndex.#e
18290 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
182a0 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c  DEFAULT_CKPTFULL
182b0 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20  FSYNC.          
182c0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
182d0 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65  CkptFullFSync.#e
182e0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
182f0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
18300 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
18310 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
18320 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
18330 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
18340 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
18350 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
18360 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
18370 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
18380 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
18390 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
183a0 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
183c0 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
183d0 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
183e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
183f0 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
18400 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
18410 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
18420 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
18430 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
18440 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
18450 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18460 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44  TE_REVERSE_UNORD
18470 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20  ERED_SELECTS).  
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18490 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
184a0 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20  rder.#endif.#if 
184b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
184c0 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
184d0 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20  ELL_CHECK).     
184e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
184f0 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a  LITE_CellSizeCk.
18500 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
18510 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
18520 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 29  _FTS3_TOKENIZER)
18530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18540 20 20 7c 20 53 51 4c 49 54 45 5f 46 74 73 33 54    | SQLITE_Fts3T
18550 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64 69 66 0a  okenizer.#endif.
18560 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18570 54 45 5f 45 4e 41 42 4c 45 5f 51 50 53 47 29 0a  TE_ENABLE_QPSG).
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18590 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   | SQLITE_Enable
185a0 51 50 53 47 0a 23 65 6e 64 69 66 0a 20 20 20 20  QPSG.#endif.    
185b0 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73    ;.  sqlite3Has
185c0 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  hInit(&db->aColl
185d0 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
185e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
185f0 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
18600 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d  HashInit(&db->aM
18610 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
18620 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66    /* Add the def
18630 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
18640 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20  equence BINARY. 
18650 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72  BINARY works for
18660 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a   both UTF-8.  **
18670 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20   and UTF-16, so 
18680 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f  add a version fo
18690 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20  r each to avoid 
186a0 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a  any unnecessary.
186b0 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
186c0 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72  . The only error
186d0 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20   that can occur 
186e0 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63  here is a malloc
186f0 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2a  () failure..  **
18700 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  ** EVIDENCE-O
18710 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38 37 38  F: R-52786-44878
18720 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65 73 20   SQLite defines 
18730 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e 20 63  three built-in c
18740 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66 75  ollating.  ** fu
18750 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20  nctions:.  */.  
18760 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
18770 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49  db, sqlite3StrBI
18780 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46  NARY, SQLITE_UTF
18790 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  8, 0, binCollFun
187a0 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
187b0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c  ollation(db, sql
187c0 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53  ite3StrBINARY, S
187d0 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30  QLITE_UTF16BE, 0
187e0 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
187f0 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
18800 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33  tion(db, sqlite3
18810 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54  StrBINARY, SQLIT
18820 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69  E_UTF16LE, 0, bi
18830 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
18840 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
18850 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53  (db, "NOCASE", S
18860 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e  QLITE_UTF8, 0, n
18870 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
18880 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
18890 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52  Collation(db, "R
188a0 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54  TRIM", SQLITE_UT
188b0 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69  F8, (void*)1, bi
188c0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
188d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
188e0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
188f0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
18900 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  }.  /* EVIDENCE-
18910 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31 37 32 32  OF: R-08308-1722
18920 34 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 6f  4 The default co
18930 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
18940 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74   for all.  ** st
18950 72 69 6e 67 73 20 69 73 20 42 49 4e 41 52 59 2e  rings is BINARY.
18960 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66   .  */.  db->pDf
18970 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  ltColl = sqlite3
18980 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
18990 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c  SQLITE_UTF8, sql
189a0 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 30  ite3StrBINARY, 0
189b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
189c0 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b  >pDfltColl!=0 );
189d0 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
189e0 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72   filename/URI ar
189f0 67 75 6d 65 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a  gument.  **.  **
18a00 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73   Only allow sens
18a10 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
18a20 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  s of bits in the
18a30 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e   flags argument.
18a40 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e    .  ** Throw an
18a50 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f   error if any no
18a60 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74  n-sense combinat
18a70 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66  ion is used.  If
18a80 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20   we.  ** do not 
18a90 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f  block illegal co
18aa0 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c  mbinations here,
18ab0 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65   it could trigge
18ac0 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20  r.  ** assert() 
18ad0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65  statements in de
18ae0 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65  eper layers.  Se
18af0 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
18b00 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20  ons.  ** are:.  
18b10 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c  **.  **  1:  SQL
18b20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18b30 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49  Y.  **  2:  SQLI
18b40 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
18b50 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49  E.  **  6:  SQLI
18b60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
18b70 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
18b80 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 64 62  CREATE.  */.  db
18b90 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
18ba0 61 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 53  ags;.  assert( S
18bb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
18bc0 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
18bd0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
18be0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
18bf0 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
18c00 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
18c10 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
18c20 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
18c30 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
18c40 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
18c50 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
18c60 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
18c70 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
18c80 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
18c90 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
18ca0 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
18cb0 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
18cc0 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
18cd0 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
18ce0 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20  & 0x46)==0 ){.  
18cf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49    rc = SQLITE_MI
18d00 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49  SUSE_BKPT;  /* I
18d10 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34 34 35 39  MP: R-65497-4459
18d20 34 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  4 */.  }else{.  
18d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18d40 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69  rseUri(zVfs, zFi
18d50 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20  lename, &flags, 
18d60 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65  &db->pVfs, &zOpe
18d70 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n, &zErrMsg);.  
18d80 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
18d90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
18da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
18db0 4d 20 29 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61  M ) sqlite3OomFa
18dc0 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  ult(db);.    sql
18dd0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
18de0 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  (db, rc, zErrMsg
18df0 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72   ? "%s" : 0, zEr
18e00 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
18e10 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
18e20 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
18e30 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
18e40 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
18e50 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
18e60 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  r */.  rc = sqli
18e70 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
18e80 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62  >pVfs, zOpen, db
18e90 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  , &db->aDb[0].pB
18ea0 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c                fl
18ec0 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ags | SQLITE_OPE
18ed0 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66  N_MAIN_DB);.  if
18ee0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18ef0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
18f00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
18f10 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
18f20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18f30 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
18f40 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
18f50 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
18f60 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71  db_out;.  }.  sq
18f70 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18f80 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
18f90 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53  .  db->aDb[0].pS
18fa0 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
18fb0 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d  chemaGet(db, db-
18fc0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
18fd0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18fe0 61 69 6c 65 64 20 29 20 45 4e 43 28 64 62 29 20  ailed ) ENC(db) 
18ff0 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29  = SCHEMA_ENC(db)
19000 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19010 4c 65 61 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d  Leave(db->aDb[0]
19020 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
19030 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
19040 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
19050 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  b, 0);..  /* The
19060 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f   default safety_
19070 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61  level for the ma
19080 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 46  in database is F
19090 55 4c 4c 3b 20 66 6f 72 20 74 68 65 20 74 65 6d  ULL; for the tem
190a0 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  p.  ** database 
190b0 69 74 20 69 73 20 4f 46 46 2e 20 54 68 69 73 20  it is OFF. This 
190c0 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65  matches the page
190d0 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73  r layer defaults
190e0 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61  .  .  */.  db->a
190f0 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d  Db[0].zDbSName =
19100 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61   "main";.  db->a
19110 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[0].safety_lev
19120 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  el = SQLITE_DEFA
19130 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b  ULT_SYNCHRONOUS+
19140 31 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  1;.  db->aDb[1].
19150 7a 44 62 53 4e 61 6d 65 20 3d 20 22 74 65 6d 70  zDbSName = "temp
19160 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ";.  db->aDb[1].
19170 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 50  safety_level = P
19180 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
19190 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67  _OFF;..  db->mag
191a0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
191b0 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62  C_OPEN;.  if( db
191c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
191d0 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
191e0 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
191f0 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75   Register all bu
19200 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
19210 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74  , but do not att
19220 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65  empt to read the
19230 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73  .  ** database s
19240 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20  chema yet. This 
19250 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
19260 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
19270 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
19280 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20  * is accessed.. 
19290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72   */.  sqlite3Err
192a0 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
192b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
192c0 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74 69 6f  sterPerConnectio
192d0 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  nBuiltinFunction
192e0 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  s(db);.  rc = sq
192f0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
19300 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
19310 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20  E_ENABLE_FTS5.  
19320 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6e 79 20  /* Register any 
19330 62 75 69 6c 74 2d 69 6e 20 46 54 53 35 20 6d 6f  built-in FTS5 mo
19340 64 75 6c 65 20 62 65 66 6f 72 65 20 6c 6f 61 64  dule before load
19350 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
19360 63 0a 20 20 2a 2a 20 65 78 74 65 6e 73 69 6f 6e  c.  ** extension
19370 73 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 61  s. This allows a
19380 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
19390 6f 6e 73 20 74 6f 20 72 65 67 69 73 74 65 72 20  ons to register 
193a0 46 54 53 35 20 0a 20 20 2a 2a 20 74 6f 6b 65 6e  FTS5 .  ** token
193b0 69 7a 65 72 73 20 61 6e 64 20 61 75 78 69 6c 69  izers and auxili
193c0 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  ary functions.  
193d0 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  */.  if( !db->ma
193e0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
193f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
19410 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts5Init(db);.  }
19420 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f  .#endif..  /* Lo
19430 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ad automatic ext
19440 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73  ensions - extens
19450 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  ions that have b
19460 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20  een registered. 
19470 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71   ** using the sq
19480 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f  lite3_automatic_
19490 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e  extension() API.
194a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
194b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
194c0 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
194d0 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
194e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
194f0 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
19500 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
19520 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
19530 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
19540 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
19550 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S1.  if( !db->ma
19560 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19570 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
19580 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c  ite3Fts1Init(sql
19590 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
195a0 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
195b0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
195c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
195d0 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66  ENABLE_FTS2.  if
195e0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
195f0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
19600 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65  E_OK ){.    exte
19610 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
19620 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s2Init(sqlite3*)
19630 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
19640 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a  e3Fts2Init(db);.
19650 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
19660 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19670 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f 6d 61 74  _FTS3 /* automat
19680 69 63 61 6c 6c 79 20 64 65 66 69 6e 65 64 20 62  ically defined b
19690 79 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  y SQLITE_ENABLE_
196a0 46 54 53 34 20 2a 2f 0a 20 20 69 66 28 20 21 64  FTS4 */.  if( !d
196b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
196c0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
196d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
196e0 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
196f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
19700 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19710 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
19720 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
19730 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
19740 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19750 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
19760 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
19770 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19780 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
19790 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
197a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
197b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
197c0 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
197d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
197e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
197f0 45 5f 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20  E_DBSTAT_VTAB.  
19800 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
19810 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
19820 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
19830 3d 20 73 71 6c 69 74 65 33 44 62 73 74 61 74 52  = sqlite3DbstatR
19840 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d  egister(db);.  }
19850 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
19860 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53  SQLITE_ENABLE_JS
19870 4f 4e 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  ON1.  if( !db->m
19880 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
19890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
198a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
198b0 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  son1Init(db);.  
198c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
198d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
198e0 54 4d 54 56 54 41 42 0a 20 20 69 66 28 20 21 64  TMTVTAB.  if( !d
198f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19900 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
19910 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19920 74 65 33 53 74 6d 74 56 74 61 62 49 6e 69 74 28  te3StmtVtabInit(
19930 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
19940 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44  .  /* -DSQLITE_D
19950 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
19960 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c  ODE=1 makes EXCL
19970 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c  USIVE the defaul
19980 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
19990 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44  ode.  -DSQLITE_D
199a0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
199b0 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41  ODE=0 make NORMA
199c0 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  L the default lo
199d0 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
199e0 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20    Doing nothing 
199f0 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65  at all also make
19a00 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  s NORMAL the def
19a10 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ault..  */.#ifde
19a20 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
19a30 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20  _LOCKING_MODE.  
19a40 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  db->dfltLockMode
19a50 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
19a60 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a  T_LOCKING_MODE;.
19a70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f    sqlite3PagerLo
19a80 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65  ckingMode(sqlite
19a90 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
19aa0 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20  aDb[0].pBt),.   
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ac0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
19ad0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
19ae0 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  DE);.#endif..  i
19af0 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45  f( rc ) sqlite3E
19b00 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20  rror(db, rc);.. 
19b10 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
19b20 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
19b30 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
19b40 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
19b50 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
19b60 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
19b70 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
19b90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19ba0 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
19bb0 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
19bc0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
19bd0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
19be0 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
19bf0 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  NT);..opendb_out
19c00 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  :.  if( db ){.  
19c10 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75    assert( db->mu
19c20 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65  tex!=0 || isThre
19c30 61 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20  adsafe==0.      
19c40 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
19c50 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
19c60 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  lMutex==0 );.   
19c70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
19c80 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
19c90 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
19ca0 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
19cb0 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
19cc0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
19cd0 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63  OMEM );.  if( rc
19ce0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
19cf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  {.    sqlite3_cl
19d00 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20  ose(db);.    db 
19d10 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
19d20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19d30 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
19d40 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53  = SQLITE_MAGIC_S
19d50 49 43 4b 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66  ICK;.  }.#if def
19d60 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
19d70 26 26 20 45 4e 41 42 4c 45 5f 46 4f 52 43 45 5f  && ENABLE_FORCE_
19d80 57 41 4c 0a 20 20 69 66 28 20 64 62 20 26 26 20  WAL.  if( db && 
19d90 21 72 63 20 29 7b 0a 20 20 20 20 69 66 20 28 28  !rc ){.    if ((
19da0 30 20 3d 3d 20 61 63 63 65 73 73 28 22 2f 76 61  0 == access("/va
19db0 72 2f 64 62 2f 65 6e 61 62 6c 65 46 6f 72 63 65  r/db/enableForce
19dc0 57 41 4c 22 2c 20 52 5f 4f 4b 29 29 29 20 7b 0a  WAL", R_OK))) {.
19dd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19de0 42 55 47 0a 20 20 20 20 20 20 66 70 72 69 6e 74  BUG.      fprint
19df0 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74  f(stderr, "SQLit
19e00 65 20 57 41 4c 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  e WAL journal_mo
19e10 64 65 20 45 4e 41 42 4c 45 44 20 62 79 20 64 65  de ENABLED by de
19e20 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a 23 65 6e 64  fault.\n");.#end
19e30 69 66 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  if.      .      
19e40 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
19e50 20 22 70 72 61 67 6d 61 20 6a 6f 75 72 6e 61 6c   "pragma journal
19e60 5f 6d 6f 64 65 3d 77 61 6c 22 2c 20 4e 55 4c 4c  _mode=wal", NULL
19e70 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 23  , NULL, NULL);.#
19e80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19e90 55 47 0a 2f 2f 20 20 20 20 7d 20 65 6c 73 65 20  UG.//    } else 
19ea0 7b 0a 2f 2f 20 20 20 20 20 20 66 70 72 69 6e 74  {.//      fprint
19eb0 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74  f(stderr, "SQLit
19ec0 65 20 57 41 4c 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  e WAL journal_mo
19ed0 64 65 20 4e 4f 54 20 45 4e 41 42 4c 45 44 20 62  de NOT ENABLED b
19ee0 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a  y default.\n");.
19ef0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
19f00 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
19f10 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
19f20 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a  E_AUTO_PROFILE).
19f30 20 20 69 66 28 20 64 62 20 26 26 20 21 72 63 20    if( db && !rc 
19f40 29 7b 0a 20 20 20 20 65 6e 61 62 6c 65 41 75 74  ){.    enableAut
19f50 6f 4c 6f 67 67 69 6e 67 28 64 62 29 3b 0a 20 20  oLogging(db);.  
19f60 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62  }.#endif.  *ppDb
19f70 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51   = db;.#ifdef SQ
19f80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52  LITE_ENABLE_SQLR
19f90 52 0a 20 20 53 52 52 65 63 4f 70 65 6e 28 64 62  R.  SRRecOpen(db
19fa0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61  , zFilename, fla
19fb0 67 73 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  gs);.#endif.#ifd
19fc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19fd0 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
19fe0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19ff0 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
1a000 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62   /* Opening a db
1a010 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
1a020 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
1a030 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f  sed 0. */.    vo
1a040 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74  id *pArg = sqlit
1a050 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a060 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73  SqllogArg;.    s
1a070 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1a080 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c  ig.xSqllog(pArg,
1a090 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   db, zFilename, 
1a0a0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  0);.  }.#endif.#
1a0b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1a0c0 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69  E_HAS_CODEC).  i
1a0d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a0e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1a0f0 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69 66  ar *zKey;.    if
1a100 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65  ( (zKey = sqlite
1a110 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1a120 7a 4f 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29  zOpen, "hexkey")
1a130 29 21 3d 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20  )!=0 && zKey[0] 
1a140 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74  ){.      u8 iByt
1a150 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e;.      int i;.
1a160 20 20 20 20 20 20 63 68 61 72 20 7a 44 65 63 6f        char zDeco
1a170 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66  ded[40];.      f
1a180 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b  or(i=0, iByte=0;
1a190 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64   i<sizeof(zDecod
1a1a0 65 64 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33  ed)*2 && sqlite3
1a1b0 49 73 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d  Isxdigit(zKey[i]
1a1c0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
1a1d0 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c   iByte = (iByte<
1a1e0 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78  <4) + sqlite3Hex
1a1f0 54 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a  ToInt(zKey[i]);.
1a200 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31          if( (i&1
1a210 29 21 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b  )!=0 ) zDecoded[
1a220 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20  i/2] = iByte;.  
1a230 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1a240 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30  te3_key_v2(db, 0
1a250 2c 20 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32 29  , zDecoded, i/2)
1a260 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a270 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
1a280 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f  uri_parameter(zO
1a290 70 65 6e 2c 20 22 6b 65 79 22 29 29 21 3d 30 20  pen, "key"))!=0 
1a2a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a2b0 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a  _key_v2(db, 0, z
1a2c0 4b 65 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  Key, sqlite3Strl
1a2d0 65 6e 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20  en30(zKey));.   
1a2e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
1a2f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70  sqlite3_free(zOp
1a300 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  en);.  return rc
1a310 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
1a320 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
1a330 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
1a340 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1a350 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
1a360 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
1a370 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
1a380 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
1a390 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
1a3a0 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1a3c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a3d0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1a3e0 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
1a3f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1a400 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
1a410 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
1a420 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1a430 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
1a440 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
1a450 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
1a460 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
1a470 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
1a480 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1a490 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
1a4a0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
1a4b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1a4c0 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
1a4d0 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
1a4e0 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
1a4f0 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28  ilename, ppDb, (
1a500 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61  unsigned int)fla
1a510 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
1a520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a530 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
1a540 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
1a550 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
1a560 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
1a570 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1a580 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
1a590 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
1a5a0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
1a5b0 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
1a5c0 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
1a5d0 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
1a5e0 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
1a5f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
1a600 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
1a610 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a620 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1a630 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
1a640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1a650 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1a660 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
1a670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a680 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
1a690 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
1a6a0 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
1a6b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
1a6c0 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65  ndif.  if( zFile
1a6d0 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e  name==0 ) zFilen
1a6e0 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22  ame = "\000\000"
1a6f0 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
1a700 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
1a710 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
1a720 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
1a730 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
1a740 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
1a750 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
1a760 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
1a770 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
1a780 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
1a790 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1a7a0 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
1a7b0 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
1a7c0 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
1a7f0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
1a800 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
1a810 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
1a820 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
1a830 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
1a840 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a850 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
1a860 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
1a870 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
1a880 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45  {.      SCHEMA_E
1a890 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28  NC(*ppDb) = ENC(
1a8a0 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f  *ppDb) = SQLITE_
1a8b0 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
1a8c0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1a8d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a8e0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  M_BKPT;.  }.  sq
1a8f0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
1a900 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
1a910 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e  rc & 0xff;.}.#en
1a920 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1a930 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
1a940 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
1a950 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
1a960 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
1a970 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
1a980 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a990 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1a9a0 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
1a9b0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1a9c0 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
1a9d0 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1a9e0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1a9f0 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1aa00 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1aa10 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
1aa20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
1aa30 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
1aa40 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e  v2(db, zName, en
1aa50 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
1aa60 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, 0);.}../*.** 
1aa70 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
1aa80 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1aa90 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
1aaa0 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
1aab0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
1aac0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
1aad0 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  2(.  sqlite3* db
1aae0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1aaf0 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
1ab00 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1ab10 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1ab20 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1ab30 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1ab40 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
1ab50 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
1ab60 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  .){.  int rc;..#
1ab70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ab80 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1ab90 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1aba0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
1abb0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
1abc0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1abd0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1abe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1abf0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1ac00 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
1ac10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1ac20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
1ac30 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
1ac40 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
1ac50 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
1ac60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
1ac70 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
1ac80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ac90 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1aca0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1acb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1acc0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
1acd0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
1ace0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1acf0 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
1ad00 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
1ad10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1ad20 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1ad30 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
1ad40 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  b, .  const void
1ad50 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65   *zName,.  int e
1ad60 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1ad70 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1ad80 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1ad90 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1ada0 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
1adb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1adc0 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  OK;.  char *zNam
1add0 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e8;..#ifdef SQLI
1ade0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1adf0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1ae00 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1ae10 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
1ae20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1ae30 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1ae40 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1ae50 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1ae60 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
1ae70 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1ae80 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20  d );.  zName8 = 
1ae90 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
1aea0 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
1aeb0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
1aec0 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  E);.  if( zName8
1aed0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
1aee0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
1aef0 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63   zName8, (u8)enc
1af00 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
1af10 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1af20 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
1af30 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  e8);.  }.  rc = 
1af40 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
1af50 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
1af60 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1af70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1af80 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1af90 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1afa0 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
1afb0 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
1afc0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1afd0 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
1afe0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1aff0 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
1b000 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
1b010 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
1b020 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1b030 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
1b040 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
1b050 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71  ion_needed(.  sq
1b060 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
1b070 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
1b080 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
1b090 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c  llNeeded)(void*,
1b0a0 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
1b0b0 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72  xtRep,const char
1b0c0 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *).){.#ifdef SQL
1b0d0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1b0e0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1b0f0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1b100 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1b110 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1b120 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1b130 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1b140 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
1b150 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78  >xCollNeeded = x
1b160 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62  CollNeeded;.  db
1b170 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
1b180 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  = 0;.  db->pColl
1b190 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
1b1a0 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
1b1b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1b1c0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1b1d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b1e0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1b1f0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
1b200 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1b210 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b220 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
1b230 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
1b240 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
1b250 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
1b260 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
1b270 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
1b280 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
1b290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b2a0 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
1b2b0 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
1b2c0 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
1b2d0 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
1b2e0 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
1b2f0 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  16)(void*,sqlite
1b300 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
1b310 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
1b320 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b330 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1b340 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1b350 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1b360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1b370 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1b380 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1b390 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1b3a0 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
1b3b0 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62  Needed = 0;.  db
1b3c0 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
1b3d0 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b  = xCollNeeded16;
1b3e0 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
1b3f0 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
1b400 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
1b410 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1b420 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1b430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b440 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b450 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
1b460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b470 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
1b480 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1b490 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61  on is now an ana
1b4a0 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65  chronism. It use
1b4b0 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20  d to be used to 
1b4c0 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a  recover from a.*
1b4d0 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  * malloc() failu
1b4e0 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e  re, but SQLite n
1b4f0 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74  ow does this aut
1b500 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69  omatically..*/.i
1b510 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61  nt sqlite3_globa
1b520 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b  l_recover(void){
1b530 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b540 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
1b550 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65  *.** Test to see
1b560 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1b570 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1b580 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75  nection is in au
1b590 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65  tocommit.** mode
1b5a0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1b5b0 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53  f it is and FALS
1b5c0 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63  E if not.  Autoc
1b5d0 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e  ommit mode is on
1b5e0 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20  .** by default. 
1b5f0 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64   Autocommit is d
1b600 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47  isabled by a BEG
1b610 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  IN statement and
1b620 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79   reenabled.** by
1b630 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54   the next COMMIT
1b640 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f   or ROLLBACK..*/
1b650 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74  .int sqlite3_get
1b660 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69  _autocommit(sqli
1b670 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
1b680 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1b690 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1b6a0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1b6b0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1b6c0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
1b6d0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
1b6e0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
1b6f0 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
1b700 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f  autoCommit;.}../
1b710 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1b720 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
1b730 73 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20  substitutes for 
1b740 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45  constants SQLITE
1b750 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c  _CORRUPT,.** SQL
1b760 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49  ITE_MISUSE, SQLI
1b770 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c  TE_CANTOPEN, SQL
1b780 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f  ITE_NOMEM and po
1b790 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72  ssibly other err
1b7a0 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  or.** constants.
1b7b0 20 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f    They serve two
1b7c0 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a   purposes:.**.**
1b7d0 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20     1.  Serve as 
1b7e0 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1b7f0 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1b800 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75  kpoint in a debu
1b810 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f  gger.**       to
1b820 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72   detect when ver
1b830 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  sion error condi
1b840 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a  tions occurs..**
1b850 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65  .**   2.  Invoke
1b860 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74   sqlite3_log() t
1b870 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f  o provide the so
1b880 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69  urce code locati
1b890 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20  on where.**     
1b8a0 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72    a low-level er
1b8b0 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74  ror is first det
1b8c0 65 63 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ected..*/.static
1b8d0 20 69 6e 74 20 72 65 70 6f 72 74 45 72 72 6f 72   int reportError
1b8e0 28 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c  (int iErr, int l
1b8f0 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61  ineno, const cha
1b900 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c  r *zType){.  sql
1b910 69 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22  ite3_log(iErr, "
1b920 25 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  %s at line %d of
1b930 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
1b940 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20           zType, 
1b950 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
1b960 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
1b970 20 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d    return iErr;.}
1b980 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
1b990 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  uptError(int lin
1b9a0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1b9b0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1b9c0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1b9d0 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74  .  return report
1b9e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52  Error(SQLITE_COR
1b9f0 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 22 64  RUPT, lineno, "d
1ba00 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1ba10 6f 6e 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  on");.}.int sqli
1ba20 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69  te3MisuseError(i
1ba30 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1ba40 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1ba50 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1ba60 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1ba70 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1ba80 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e  TE_MISUSE, linen
1ba90 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a  o, "misuse");.}.
1baa0 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f  int sqlite3Canto
1bab0 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  penError(int lin
1bac0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1bad0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1bae0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1baf0 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74  .  return report
1bb00 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1bb10 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f 2c 20 22  TOPEN, lineno, "
1bb20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
1bb30 22 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ");.}.#ifdef SQL
1bb40 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
1bb50 6c 69 74 65 33 43 6f 72 72 75 70 74 50 67 6e 6f  lite3CorruptPgno
1bb60 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1bb70 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1bb80 63 68 61 72 20 7a 4d 73 67 5b 31 30 30 5d 3b 0a  char zMsg[100];.
1bb90 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1bba0 74 66 28 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c  tf(sizeof(zMsg),
1bbb0 20 7a 4d 73 67 2c 20 22 64 61 74 61 62 61 73 65   zMsg, "database
1bbc0 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
1bbd0 20 25 64 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 74   %d", pgno);.  t
1bbe0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1bbf0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
1bc00 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  g!=0 );.  return
1bc10 20 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c   reportError(SQL
1bc20 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e  ITE_CORRUPT, lin
1bc30 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e  eno, zMsg);.}.in
1bc40 74 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72  t sqlite3NomemEr
1bc50 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1bc60 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1bc70 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1bc80 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1bc90 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72  turn reportError
1bca0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 6c  (SQLITE_NOMEM, l
1bcb0 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a 7d  ineno, "OOM");.}
1bcc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f 65 72  .int sqlite3Ioer
1bcd0 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20  rnomemError(int 
1bce0 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
1bcf0 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
1bd00 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
1bd10 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70   );.  return rep
1bd20 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1bd30 49 4f 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e  IOERR_NOMEM, lin
1bd40 65 6e 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72  eno, "I/O OOM er
1bd50 72 6f 72 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ror");.}.#endif.
1bd60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bd70 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
1bd80 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
1bd90 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
1bda0 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
1bdb0 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
1bdc0 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
1bdd0 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
1bde0 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
1bdf0 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
1be00 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
1be10 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
1be20 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
1be30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
1be40 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
1be50 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
1be60 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
1be70 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
1be80 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
1be90 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
1bea0 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
1beb0 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
1bec0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1bed0 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
1bee0 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
1bef0 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
1bf00 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
1bf10 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
1bf20 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
1bf30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61  /.int sqlite3_ta
1bf40 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
1bf50 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ata(.  sqlite3 *
1bf60 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
1bf70 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1bf80 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
1bf90 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1bfa0 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ,        /* Data
1bfb0 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c  base name or NUL
1bfc0 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
1bfd0 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20  r *zTableName,  
1bfe0 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
1bff0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1c000 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20   *zColumnName,  
1c010 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
1c020 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
1c030 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20   **pzDataType,  
1c040 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63    /* OUTPUT: Dec
1c050 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20  lared data type 
1c060 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
1c070 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20  **pzCollSeq,    
1c080 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c   /* OUTPUT: Coll
1c090 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
1c0a0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  ame */.  int *pN
1c0b0 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  otNull,         
1c0c0 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1c0d0 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c  True if NOT NULL
1c0e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73   constraint exis
1c0f0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72  ts */.  int *pPr
1c100 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20  imaryKey,       
1c110 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1c120 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61  rue if column pa
1c130 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e  rt of PK */.  in
1c140 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20  t *pAutoinc     
1c150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1c160 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
1c170 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72  umn is auto-incr
1c180 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ement */.){.  in
1c190 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
1c1a0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62  rrMsg = 0;.  Tab
1c1b0 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
1c1c0 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
1c1d0 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30  ;.  int iCol = 0
1c1e0 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
1c1f0 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20  zDataType = 0;. 
1c200 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1c210 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74  llSeq = 0;.  int
1c220 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20   notnull = 0;.  
1c230 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d  int primarykey =
1c240 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e   0;.  int autoin
1c250 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20  c = 0;...#ifdef 
1c260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1c270 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1c280 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1c290 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c  kOk(db) || zTabl
1c2a0 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eName==0 ){.    
1c2b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1c2c0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
1c2d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75  endif..  /* Ensu
1c2e0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1c2f0 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
1c300 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
1c310 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1c320 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
1c330 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
1c340 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
1c350 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
1c360 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
1c370 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
1c380 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
1c390 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
1c3a0 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
1c3b0 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
1c3c0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1c3d0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
1c3e0 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
1c3f0 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
1c400 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
1c410 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
1c420 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
1c430 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
1c440 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
1c450 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
1c460 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
1c470 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d  if( zColumnName=
1c480 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65  =0 ){.    /* Que
1c490 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65  ry for existance
1c4a0 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a   of table only *
1c4b0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
1c4c0 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
1c4d0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
1c4e0 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  ++){.      pCol 
1c4f0 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
1c500 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ol];.      if( 0
1c510 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1c520 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
1c530 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
1c540 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c550 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1c560 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e  f( iCol==pTab->n
1c570 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
1c580 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1c590 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
1c5a0 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  d(zColumnName) )
1c5b0 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
1c5c0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
1c5d0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f        pCol = iCo
1c5e0 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43  l>=0 ? &pTab->aC
1c5f0 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20  ol[iCol] : 0;.  
1c600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c610 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
1c620 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
1c630 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1c640 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
1c650 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
1c660 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61   stores the meta
1c670 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
1c680 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
1c690 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63  ed.  ** to the c
1c6a0 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76  aller in local v
1c6b0 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79  ariables zDataTy
1c6c0 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f  pe, zCollSeq, no
1c6d0 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65  tnull, primaryke
1c6e0 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69  y.  ** and autoi
1c6f0 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  nc. At this poin
1c700 74 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  t there are two 
1c710 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20  possibilities:. 
1c720 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e   ** .  **     1.
1c730 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63   The specified c
1c740 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72  olumn name was r
1c750 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20  owid", "oid" or 
1c760 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20  "_rowid_" .  ** 
1c770 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65         and there
1c780 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c   is no explicitl
1c790 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63  y declared IPK c
1c7a0 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a  olumn. .  **.  *
1c7b0 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62  *     2. The tab
1c7c0 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  le is not a view
1c7d0 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
1c7e0 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20  name identified 
1c7f0 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  an .  **        
1c800 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
1c810 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79  red column. Copy
1c820 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
1c830 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20  n from *pCol..  
1c840 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29  */ .  if( pCol )
1c850 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
1c860 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
1c870 79 70 65 28 70 43 6f 6c 2c 30 29 3b 0a 20 20 20  ype(pCol,0);.   
1c880 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c   zCollSeq = pCol
1c890 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74  ->zColl;.    not
1c8a0 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74  null = pCol->not
1c8b0 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69  Null!=0;.    pri
1c8c0 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c  marykey  = (pCol
1c8d0 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
1c8e0 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30  FLAG_PRIMKEY)!=0
1c8f0 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20  ;.    autoinc = 
1c900 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f  pTab->iPKey==iCo
1c910 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  l && (pTab->tabF
1c920 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
1c930 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d  crement)!=0;.  }
1c940 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54  else{.    zDataT
1c950 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
1c960 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
1c970 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  = 1;.  }.  if( !
1c980 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  zCollSeq ){.    
1c990 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74  zCollSeq = sqlit
1c9a0 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d  e3StrBINARY;.  }
1c9b0 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
1c9c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c9d0 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57  All(db);..  /* W
1c9e0 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
1c9f0 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64  ion call succeed
1ca00 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65  ed or failed, se
1ca10 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  t the output par
1ca20 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20  ameters.  ** to 
1ca30 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c  whatever their l
1ca40 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74  ocal counterpart
1ca50 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e  s contain. If an
1ca60 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72   error did occur
1ca70 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20  ,.  ** this has 
1ca80 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65  the effect of ze
1ca90 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74  roing all output
1caa0 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
1cab0 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79  /.  if( pzDataTy
1cac0 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65  pe ) *pzDataType
1cad0 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20   = zDataType;.  
1cae0 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20  if( pzCollSeq ) 
1caf0 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f  *pzCollSeq = zCo
1cb00 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f  llSeq;.  if( pNo
1cb10 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c  tNull ) *pNotNul
1cb20 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  l = notnull;.  i
1cb30 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29  f( pPrimaryKey )
1cb40 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20   *pPrimaryKey = 
1cb50 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66  primarykey;.  if
1cb60 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41  ( pAutoinc ) *pA
1cb70 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63  utoinc = autoinc
1cb80 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
1cb90 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20  OK==rc && !pTab 
1cba0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1cbb0 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
1cbc0 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  );.    zErrMsg =
1cbd0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1cbe0 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  db, "no such tab
1cbf0 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73  le column: %s.%s
1cc00 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20  ", zTableName,. 
1cc10 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61         zColumnNa
1cc20 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
1cc30 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1cc40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
1cc50 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a  thMsg(db, rc, (z
1cc60 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20  ErrMsg?"%s":0), 
1cc70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1cc80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
1cc90 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73  rrMsg);.  rc = s
1cca0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
1ccb0 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1ccc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1ccd0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1cce0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1ccf0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
1cd00 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
1cd10 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
1cd20 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
1cd30 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
1cd40 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
1cd50 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
1cd60 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
1cd70 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1cd80 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73  d(0);.  if( pVfs
1cd90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1cda0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
1cdb0 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c  ion works in mil
1cdc0 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74  liseconds, but t
1cdd0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73  he underlying Os
1cde0 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50  Sleep() .  ** AP
1cdf0 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f  I uses microseco
1ce00 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31  nds. Hence the 1
1ce10 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  000's..  */.  rc
1ce20 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65   = (sqlite3OsSle
1ce30 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73  ep(pVfs, 1000*ms
1ce40 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
1ce50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
1ce60 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
1ce70 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1ce80 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69  sult codes..*/.i
1ce90 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
1cea0 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
1ceb0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
1cec0 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66  t onoff){.#ifdef
1ced0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1cee0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1cef0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1cf00 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1cf10 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1cf20 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1cf30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1cf40 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1cf50 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f   db->errMask = o
1cf60 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66  noff ? 0xfffffff
1cf70 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69  f : 0xff;.  sqli
1cf80 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1cf90 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1cfa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cfb0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1cfc0 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
1cfd0 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72   method on a par
1cfe0 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1cff0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d000 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71  _file_control(sq
1d010 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1d020 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1d030 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1d040 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rg){.  int rc = 
1d050 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1d060 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a  Btree *pBtree;..
1d070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1d080 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1d090 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1d0a0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1d0b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1d0c0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1d0d0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1d0e0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1d0f0 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20  ex);.  pBtree = 
1d100 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1d110 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1d120 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
1d130 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
1d140 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
1d150 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20  3_file *fd;.    
1d160 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1d170 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
1d180 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
1d190 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65  treePager(pBtree
1d1a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d1b0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
1d1c0 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
1d1d0 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
1d1e0 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30     assert( fd!=0
1d1f0 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d   );.    if( op==
1d200 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
1d210 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  E_POINTER ){.   
1d220 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c     *(sqlite3_fil
1d230 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20  e**)pArg = fd;. 
1d240 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d250 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1d260 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1d270 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20  NTL_VFS_POINTER 
1d280 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1d290 65 33 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d 20  e3_vfs**)pArg = 
1d2a0 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
1d2b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1d2c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d2d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d     }else if( op=
1d2e0 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f  =SQLITE_FCNTL_JO
1d2f0 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b  URNAL_POINTER ){
1d300 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1d310 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73  _file**)pArg = s
1d320 71 6c 69 74 65 33 50 61 67 65 72 4a 72 6e 6c 46  qlite3PagerJrnlF
1d330 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
1d340 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d350 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1d360 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
1d370 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1d380 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1d390 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  (fd, op, pArg);.
1d3a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d3b0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 69 66  MIT_WAL.      if
1d3c0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
1d3d0 29 26 26 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  )&&(op==SQLITE_F
1d3e0 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 29  CNTL_LAST_ERRNO)
1d3f0 26 26 28 2a 28 69 6e 74 20 2a 29 70 41 72 67 3d  &&(*(int *)pArg=
1d400 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
1d410 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61  qlite3_file *pWa
1d420 6c 46 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  lFd = sqlite3Pag
1d430 65 72 57 61 6c 46 69 6c 65 28 70 50 61 67 65 72  erWalFile(pPager
1d440 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1d450 57 61 6c 46 64 26 26 28 70 57 61 6c 46 64 2d 3e  WalFd&&(pWalFd->
1d460 70 4d 65 74 68 6f 64 73 29 20 29 7b 0a 20 20 20  pMethods) ){.   
1d470 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d480 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1d490 28 70 57 61 6c 46 64 2c 20 6f 70 2c 20 70 41 72  (pWalFd, op, pAr
1d4a0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
1d4b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1d4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1d4d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
1d4e0 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ND;.    }.    sq
1d4f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1d500 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73  pBtree);.  }.  s
1d510 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
1d520 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
1d530 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1d540 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1d550 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  rc;.}../*.** Int
1d560 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
1d570 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
1d580 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
1d590 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
1d5a0 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
1d5b0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
1d5c0 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20  TE_UNTESTABLE.  
1d5d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d5e0 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61  (op);.#else.  va
1d5f0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
1d600 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
1d610 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
1d620 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76     /*.    ** Sav
1d630 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  e the current st
1d640 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e  ate of the PRNG.
1d650 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d660 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d670 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20  _PRNG_SAVE: {.  
1d680 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53      sqlite3PrngS
1d690 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  aveState();.    
1d6a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d6b0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
1d6c0 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20  store the state 
1d6d0 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74  of the PRNG to t
1d6e0 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61  he last state sa
1d6f0 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  ved using.    **
1d700 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20   PRNG_SAVE.  If 
1d710 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65  PRNG_SAVE has ne
1d720 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
1d730 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  called, then.   
1d740 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63   ** this verb ac
1d750 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53  ts like PRNG_RES
1d760 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ET..    */.    c
1d770 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1d780 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
1d790 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d7a0 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74  3PrngRestoreStat
1d7b0 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
1d7c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1d7d0 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65      ** Reset the
1d7e0 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74   PRNG back to it
1d7f0 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
1d800 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74  state.  The next
1d810 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
1d820 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1d830 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64  ss() will reseed
1d840 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20   the PRNG using 
1d850 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20  a single call.  
1d860 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e    ** to the xRan
1d870 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f  domness method o
1d880 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  f the default VF
1d890 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  S..    */.    ca
1d8a0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1d8b0 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b  RL_PRNG_RESET: {
1d8c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1d8d0 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
1d8e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d8f0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1d900 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1d910 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54  control(BITVEC_T
1d920 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72  EST, size, progr
1d930 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  am).    **.    *
1d940 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61  * Run a test aga
1d950 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62  inst a Bitvec ob
1d960 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54  ject of size.  T
1d970 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d  he program argum
1d980 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e  ent.    ** is an
1d990 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
1d9a0 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  rs that defines 
1d9b0 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72  the test.  Retur
1d9c0 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a  n -1 on a.    **
1d9d0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1d9e0 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73  on error, 0 on s
1d9f0 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a  uccess, or non-z
1da00 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72  ero for an error
1da10 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65  ..    ** See the
1da20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
1da30 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20  iltinTest() for 
1da40 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1da50 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
1da60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1da70 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54  ESTCTRL_BITVEC_T
1da80 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EST: {.      int
1da90 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
1daa0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74   int);.      int
1dab0 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67   *aProg = va_arg
1dac0 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
1dad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
1dae0 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
1daf0 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20  sz, aProg);.    
1db00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1db10 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1db20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1db30 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c  rol(FAULT_INSTAL
1db40 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20  L, xCallback).  
1db50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61    **.    ** Arra
1db60 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43  nge to invoke xC
1db70 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76  allback() whenev
1db80 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  er sqlite3FaultS
1db90 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a  im() is called,.
1dba0 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62      ** if xCallb
1dbb0 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ack is not NULL.
1dbc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1dbd0 73 20 61 20 74 65 73 74 20 6f 66 20 74 68 65 20  s a test of the 
1dbe0 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20  fault simulator 
1dbf0 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66  mechanism itself
1dc00 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  , sqlite3FaultSi
1dc10 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63  m(0).    ** is c
1dc20 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  alled immediatel
1dc30 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69  y after installi
1dc40 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62  ng the new callb
1dc50 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75  ack and the retu
1dc60 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  rn.    ** value 
1dc70 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c  from sqlite3Faul
1dc80 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20  tSim(0) becomes 
1dc90 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a  the return from.
1dca0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74      ** sqlite3_t
1dcb0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20  est_control().. 
1dcc0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1dcd0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
1dce0 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a  AULT_INSTALL: {.
1dcf0 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
1dd00 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
1dd10 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
1dd20 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
1dd30 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
1dd40 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
1dd50 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
1dd60 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
1dd70 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43  balConfig.xTestC
1dd80 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67  allback = va_arg
1dd90 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29  (ap, int(*)(int)
1dda0 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  );.      */.    
1ddb0 20 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54    typedef int(*T
1ddc0 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f  ESTCALLBACKFUNC_
1ddd0 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  t)(int);.      s
1dde0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ddf0 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b  ig.xTestCallback
1de00 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45   = va_arg(ap, TE
1de10 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74  STCALLBACKFUNC_t
1de20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1de30 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
1de40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1de50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1de60 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1de70 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e  t_control(BENIGN
1de80 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78  _MALLOC_HOOKS, x
1de90 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20  Begin, xEnd).   
1dea0 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73   **.    ** Regis
1deb0 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c  ter hooks to cal
1dec0 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  l to indicate wh
1ded0 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ich malloc() fai
1dee0 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72  lures .    ** ar
1def0 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f  e benign..    */
1df00 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1df10 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e  _TESTCTRL_BENIGN
1df20 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b  _MALLOC_HOOKS: {
1df30 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
1df40 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74  oid (*void_funct
1df50 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20  ion)(void);.    
1df60 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
1df70 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20  xBenignBegin;.  
1df80 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
1df90 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20  n xBenignEnd;.  
1dfa0 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e      xBenignBegin
1dfb0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1dfc0 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
1dfd0 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d      xBenignEnd =
1dfe0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1dff0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
1e000 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d    sqlite3BenignM
1e010 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69  allocHooks(xBeni
1e020 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e  gnBegin, xBenign
1e030 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  End);.      brea
1e040 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1e050 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1e060 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1e070 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
1e080 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69  NDING_BYTE, unsi
1e090 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20  gned int X).    
1e0a0 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1e0b0 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74  e PENDING byte t
1e0c0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  o the value in t
1e0d0 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  he argument, if 
1e0e0 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65  X>0..    ** Make
1e0f0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58   no changes if X
1e100 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ==0.  Return the
1e110 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65   value of the pe
1e120 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a  nding byte.    *
1e130 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67  * as it existing
1e140 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
1e150 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e  tine was called.
1e160 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1e170 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67  MPORTANT:  Chang
1e180 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
1e190 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30  byte from 0x4000
1e1a0 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a  0000 results in.
1e1b0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70      ** an incomp
1e1c0 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20  atible database 
1e1d0 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68  file format.  Ch
1e1e0 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
1e1f0 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77  NG byte.    ** w
1e200 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73  hile any databas
1e210 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
1e220 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  open results in 
1e230 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20  undefined and.  
1e240 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73    ** deleterious
1e250 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a   behavior..    *
1e260 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e270 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
1e280 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20  NG_BYTE: {.     
1e290 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59   rc = PENDING_BY
1e2a0 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  TE;.#ifndef SQLI
1e2b0 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20  TE_OMIT_WSD.    
1e2c0 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69    {.        unsi
1e2d0 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20  gned int newVal 
1e2e0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73  = va_arg(ap, uns
1e2f0 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20  igned int);.    
1e300 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29      if( newVal )
1e310 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42   sqlite3PendingB
1e320 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20  yte = newVal;.  
1e330 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e340 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e350 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1e360 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e370 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e380 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74  CTRL_ASSERT, int
1e390 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
1e3a0 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
1e3b0 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
1e3c0 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68  e test to see wh
1e3d0 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20  ether or not.   
1e3e0 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73   ** assert() was
1e3f0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
1e400 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20  ile-time.  If X 
1e410 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65  is true and asse
1e420 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65  rt().    ** is e
1e430 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
1e440 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1e450 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20   true.  If X is 
1e460 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20  true and.    ** 
1e470 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
1e480 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1e490 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
1e4a0 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20  ero.  If X is.  
1e4b0 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61    ** false and a
1e4c0 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
1e4d0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73  ed, then the ass
1e4e0 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64  ertion fires and
1e4f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63   the.    ** proc
1e500 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20  ess aborts.  If 
1e510 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61  X is false and a
1e520 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1e530 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  led, then the.  
1e540 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
1e550 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e is zero..    *
1e560 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e570 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1e580 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74  T: {.      volat
1e590 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20  ile int x = 0;. 
1e5a0 20 20 20 20 20 61 73 73 65 72 74 28 20 2f 2a 73       assert( /*s
1e5b0 69 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f  ide-effects-ok*/
1e5c0 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (x = va_arg(ap,
1e5d0 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  int))!=0 );.    
1e5e0 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20    rc = x;.      
1e5f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
1e600 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1e610 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1e620 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1e630 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58  RL_ALWAYS, int X
1e640 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1e650 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1e660 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1e670 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20  test to see how 
1e680 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20  the ALWAYS and. 
1e690 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72     ** NEVER macr
1e6a0 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  os were defined 
1e6b0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
1e6c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1e6d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1e6e0 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a  is ALWAYS(X).  .
1e6f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1e700 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65  e recommended te
1e710 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20  st is X==2.  If 
1e720 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1e730 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e   is 2, that mean
1e740 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28  s.    ** ALWAYS(
1e750 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1e760 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73  e both no-op pas
1e770 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
1e780 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20  , which is the. 
1e790 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65     ** default se
1e7a0 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  tting.  If the r
1e7b0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
1e7c0 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20  , then ALWAYS() 
1e7d0 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  is either.    **
1e7e0 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74   hard-coded to t
1e7f0 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61  rue or else it a
1e800 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72  sserts if its ar
1e810 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e  gument is false.
1e820 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
1e830 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64  t behavior (hard
1e840 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20  -coded to true) 
1e850 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
1e860 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
1e870 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
1e880 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
1e890 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64   is disabled and
1e8a0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
1e8b0 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73  ** behavior (ass
1e8c0 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ert if the argum
1e8d0 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20  ent to ALWAYS() 
1e8e0 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65  is false) is the
1e8f0 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1e900 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e910 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1e920 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  t assert() is en
1e930 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  abled..    **.  
1e940 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d    ** The run-tim
1e950 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
1e960 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
1e970 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
1e980 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1e990 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
1e9a0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1e9b0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1e9c0 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20  S, 2)==2 ){.    
1e9d0 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1e9e0 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1e9f0 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  are no-op pass-t
1ea00 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20  hrough macros.  
1ea10 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66    **    }else if
1ea20 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
1ea30 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ea40 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31  STCTRL_ASSERT, 1
1ea50 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  ) ){.    **     
1ea60 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73   // ALWAYS(x) as
1ea70 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20  serts that x is 
1ea80 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61  true. NEVER(x) a
1ea90 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73  sserts x is fals
1eaa0 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  e..    **    }el
1eab0 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se{.    **      
1eac0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20  // ALWAYS(x) is 
1ead0 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e  a constant 1.  N
1eae0 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e  EVER(x) is a con
1eaf0 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20  stant 0..    ** 
1eb00 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
1eb10 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1eb20 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20  CTRL_ALWAYS: {. 
1eb30 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1eb40 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1eb50 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78     rc = ALWAYS(x
1eb60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1eb70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1eb80 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    **   sqlite3_t
1eb90 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1eba0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
1ebb0 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20  ORDER);.    **. 
1ebc0 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65     ** The intege
1ebd0 72 20 72 65 74 75 72 6e 65 64 20 72 65 76 65 61  r returned revea
1ebe0 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65  ls the byte-orde
1ebf0 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65  r of the compute
1ec00 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a  r on which.    *
1ec10 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e  * SQLite is runn
1ec20 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ing:.    **.    
1ec30 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 62  **       1     b
1ec40 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65  ig-endian,    de
1ec50 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d  termined at run-
1ec60 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  time.    **     
1ec70 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65   10     little-e
1ec80 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1ec90 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20  d at run-time.  
1eca0 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20    **  432101    
1ecb0 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20   big-endian,    
1ecc0 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
1ecd0 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
1ece0 2a 20 20 31 32 33 34 31 30 20 20 20 20 20 6c 69  *  123410     li
1ecf0 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
1ed00 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  ermined at compi
1ed10 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a  le-time.    */ .
1ed20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ed30 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44  TESTCTRL_BYTEORD
1ed40 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ER: {.      rc =
1ed50 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45   SQLITE_BYTEORDE
1ed60 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c  R*100 + SQLITE_L
1ed70 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b  ITTLEENDIAN*10 +
1ed80 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41   SQLITE_BIGENDIA
1ed90 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  N;.      break;.
1eda0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1edb0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1edc0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1edd0 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71  CTRL_RESERVE, sq
1ede0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
1edf0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1ee00 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65  Set the nReserve
1ee10 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74   size to N for t
1ee20 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1ee30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ee40 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  .    ** connecti
1ee50 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  on db..    */.  
1ee60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1ee70 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20  STCTRL_RESERVE: 
1ee80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
1ee90 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
1eea0 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
1eeb0 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
1eec0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1eed0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1eee0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1eef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1ef00 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62  eeSetPageSize(db
1ef10 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
1ef20 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   x, 0);.      sq
1ef30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1ef40 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1ef50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ef60 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
1ef70 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1ef80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1ef90 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71  PTIMIZATIONS, sq
1efa0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
1efb0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1efc0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
1efd0 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  e various optimi
1efe0 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74  zations for test
1eff0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54  ing purposes.  T
1f000 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d  he .    ** argum
1f010 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61  ent N is a bitma
1f020 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  sk of optimizati
1f030 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ons to be disabl
1f040 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a  ed.  For normal.
1f050 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
1f060 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20   N should be 0. 
1f070 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
1f080 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d  t a test program
1f090 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a   (like the.    *
1f0a0 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74  * SQL Logic Test
1f0b0 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64   or SLT test mod
1f0c0 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65  ule) can run the
1f0d0 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70   same SQL multip
1f0e0 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20  le times.    ** 
1f0f0 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74  with various opt
1f100 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62  imizations disab
1f110 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68  led to verify th
1f120 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
1f130 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74  er.    ** is obt
1f140 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63  ained in every c
1f150 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1f160 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f170 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1f180 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NS: {.      sqli
1f190 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1f1a0 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1f1b0 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46        db->dbOptF
1f1c0 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f  lags = (u16)(va_
1f1d0 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30  arg(ap, int) & 0
1f1e0 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72  xffff);.      br
1f1f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
1f200 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  ef SQLITE_N_KEYW
1f210 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  ORD.    /* sqlit
1f220 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1f230 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f240 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74  ISKEYWORD, const
1f250 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20   char *zWord).  
1f260 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a    **.    ** If z
1f270 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72  Word is a keywor
1f280 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20  d recognized by 
1f290 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e  the parser, then
1f2a0 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20   return the.    
1f2b0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79  ** number of key
1f2c0 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57  words.  Or if zW
1f2d0 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79  ord is not a key
1f2e0 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  word, return 0..
1f2f0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54      ** .    ** T
1f300 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72 65  his test feature
1f310 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
1f320 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61  le in the amalga
1f330 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20  mation since.   
1f340 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e   ** the SQLITE_N
1f350 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69  _KEYWORD macro i
1f360 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e  s not defined in
1f370 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53 51   this file if SQ
1f380 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  Lite.    ** is b
1f390 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72  uilt using separ
1f3a0 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73  ate source files
1f3b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1f3c0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1f3d0 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20  L_ISKEYWORD: {. 
1f3e0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1f3f0 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28  *zWord = va_arg(
1f400 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
1f410 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
1f420 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1f430 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63  zWord);.      rc
1f440 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f   = (sqlite3Keywo
1f450 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72  rdCode((u8*)zWor
1f460 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20  d, n)!=TK_ID) ? 
1f470 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
1f480 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   : 0;.      brea
1f490 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1f4a0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1f4b0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1f4c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f4d0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c  LOCALTIME_FAULT,
1f4e0 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20   int onoff);.   
1f4f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61   **.    ** If pa
1f500 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73  rameter onoff is
1f510 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69   non-zero, confi
1f520 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65 72  gure the wrapper
1f530 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20  s so that all.  
1f540 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
1f550 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69  calls to localti
1f560 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74  me() and variant
1f570 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66  s fail. If onoff
1f580 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a   is zero,.    **
1f590 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69   undo this setti
1f5a0 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ng..    */.    c
1f5b0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1f5c0 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
1f5d0 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULT: {.      sql
1f5e0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f5f0 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74  .bLocaltimeFault
1f600 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1f610 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1f620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1f630 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f640 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1f650 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
1f660 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a  UPT, int);.    *
1f670 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20  *.    ** Set or 
1f680 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68 61  clear a flag tha
1f690 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
1f6a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f6b0 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c  le is always wel
1f6c0 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64  l-.    ** formed
1f6d0 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75   and never corru
1f6e0 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69  pt.  This flag i
1f6f0 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61 75  s clear by defau
1f700 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lt, indicating t
1f710 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  hat.    ** datab
1f720 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20  ase files might 
1f730 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20 63  have arbitrary c
1f740 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74  orruption.  Sett
1f750 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75 72  ing the flag dur
1f760 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69  ing.    ** testi
1f770 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61 69  ng causes certai
1f780 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1f790 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64  ments in the cod
1f7a0 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74 65  e to be activate
1f7b0 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65  d.    ** that de
1f7c0 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61  monstrat invaria
1f7d0 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d  nts on well-form
1f7e0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1f7f0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
1f800 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1f810 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
1f820 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1f830 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65  3GlobalConfig.ne
1f840 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f  verCorrupt = va_
1f850 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1f860 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f870 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1f880 20 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77 68   threshold at wh
1f890 69 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e  ich OP_Once coun
1f8a0 74 65 72 73 20 72 65 73 65 74 20 62 61 63 6b 20  ters reset back 
1f8b0 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 20  to zero..    ** 
1f8c0 42 79 20 64 65 66 61 75 6c 74 20 74 68 69 73 20  By default this 
1f8d0 69 73 20 30 78 37 66 66 66 66 66 66 65 20 28 6f  is 0x7ffffffe (o
1f8e0 76 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c 20  ver 2 billion), 
1f8f0 62 75 74 20 74 68 61 74 20 76 61 6c 75 65 20 69  but that value i
1f900 73 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69 67  s.    ** too big
1f910 20 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72 65   to test in a re
1f920 61 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74 20  asonable amount 
1f930 6f 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69 73  of time, so this
1f940 20 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20 20   control is.    
1f950 2a 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20 73  ** provided to s
1f960 65 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20 65  et a small and e
1f970 61 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65 20  asily reachable 
1f980 72 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20 20  reset value..   
1f990 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1f9a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e 43  ITE_TESTCTRL_ONC
1f9b0 45 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f 4c  E_RESET_THRESHOL
1f9c0 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
1f9d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f9e0 4f 6e 63 65 52 65 73 65 74 54 68 72 65 73 68 6f  OnceResetThresho
1f9f0 6c 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ld = va_arg(ap, 
1fa00 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1fa10 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1fa20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1fa30 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1fa40 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56  ESTCTRL_VDBE_COV
1fa50 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b  ERAGE, xCallback
1fa60 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20  , ptr);.    **. 
1fa70 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44     ** Set the VD
1fa80 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1fa90 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f  back function to
1faa0 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20   xCallback with 
1fab0 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20  context .    ** 
1fac0 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20  pointer ptr..   
1fad0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1fae0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42  ITE_TESTCTRL_VDB
1faf0 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69  E_COVERAGE: {.#i
1fb00 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
1fb10 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20  _COVERAGE.      
1fb20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62  typedef void (*b
1fb30 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28  ranch_callback)(
1fb40 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29  void*,int,u8,u8)
1fb50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1fb60 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
1fb70 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67  eBranch = va_arg
1fb80 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62  (ap,branch_callb
1fb90 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ack);.      sqli
1fba0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fbb0 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d  pVdbeBranchArg =
1fbc0 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a   va_arg(ap,void*
1fbd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1fbe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1fbf0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1fc00 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1fc10 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
1fc20 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61  ER_MMAP, db, nMa
1fc30 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  x); */.    case 
1fc40 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fc50 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20  SORTER_MMAP: {. 
1fc60 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1fc70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
1fc80 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64  lite3*);.      d
1fc90 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61  b->nMaxSorterMma
1fca0 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
1fcb0 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
1fcc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1fcd0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1fce0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1fcf0 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a  STCTRL_ISINIT);.
1fd00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
1fd10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1fd20 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65 65  f SQLite has bee
1fd30 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  n initialized an
1fd40 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  d SQLITE_ERROR i
1fd50 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20  f.    ** not..  
1fd60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1fd70 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
1fd80 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  INIT: {.      if
1fd90 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1fda0 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20  onfig.isInit==0 
1fdb0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ) rc = SQLITE_ER
1fdc0 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1fdd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1fde0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1fdf0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1fe00 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
1fe10 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66  db, dbName, onOf
1fe20 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a  f, tnum);.    **
1fe30 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
1fe40 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65  t control is use
1fe50 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f  d to create impo
1fe60 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64  ster tables.  "d
1fe70 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a  b" is a pointer.
1fe80 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61      ** to the da
1fe90 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1fea0 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68  n.  dbName is th
1feb0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1fec0 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20  (ex: "main" or. 
1fed0 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68     ** "temp") wh
1fee0 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65  ich will receive
1fef0 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20   the imposter.  
1ff00 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d  "onOff" turns im
1ff10 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20  poster mode on. 
1ff20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22     ** or off.  "
1ff30 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f  tnum" is the roo
1ff40 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
1ff50 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74 68  tree to which th
1ff60 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a  e imposter.    *
1ff70 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63  * table should c
1ff80 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20  onnect..    **. 
1ff90 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70     ** Enable imp
1ffa0 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20  oster mode only 
1ffb0 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
1ffc0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1ffd0 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20   parsed.  Then. 
1ffe0 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67     ** run a sing
1fff0 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  le CREATE TABLE 
20000 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e  statement to con
20010 73 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73  struct the impos
20020 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20  ter table in.   
20030 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 73   ** the parsed s
20040 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72  chema.  Then tur
20050 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20  n imposter mode 
20060 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a  back off again..
20070 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
20080 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e   onOff==0 and tn
20090 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20  um>0 then reset 
200a0 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61  the schema for a
200b0 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63 61  ll databases, ca
200c0 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  using.    ** the
200d0 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65   schema to be re
200e0 70 61 72 73 65 64 20 74 68 65 20 6e 65 78 74 20  parsed the next 
200f0 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65  time it is neede
20100 64 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65  d.  This has the
20110 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f  .    ** effect o
20120 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d  f erasing all im
20130 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20  poster tables.. 
20140 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
20150 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
20160 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  MPOSTER: {.     
20170 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
20180 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
20190 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  3*);.      sqlit
201a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
201b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
201c0 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20   db->init.iDb = 
201d0 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
201e0 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c  e(db, va_arg(ap,
201f0 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20  const char*));. 
20200 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75       db->init.bu
20210 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d  sy = db->init.im
20220 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61  posterTable = va
20230 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
20240 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77      db->init.new
20250 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70  Tnum = va_arg(ap
20260 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ,int);.      if(
20270 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
20280 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  0 && db->init.ne
20290 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20  wTnum>0 ){.     
202a0 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41     sqlite3ResetA
202b0 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65  llSchemasOfConne
202c0 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20  ction(db);.     
202d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
202e0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
202f0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
20300 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
20310 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65    va_end(ap);.#e
20320 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55  ndif /* SQLITE_U
20330 4e 54 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20 72  NTESTABLE */.  r
20340 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20350 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
20360 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73  lity routine, us
20370 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c  eful to VFS impl
20380 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61  ementations, tha
20390 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73  t checks.** to s
203a0 65 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65  ee if a database
203b0 20 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20   file was a URI 
203c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61  that contained a
203d0 20 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20   specific query 
203e0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61  .** parameter, a
203f0 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73  nd if so obtains
20400 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
20410 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
20420 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  r..**.** The zFi
20430 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
20440 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  is the filename 
20450 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69  pointer passed i
20460 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a  nto the xOpen().
20470 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56  ** method of a V
20480 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
20490 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61  n.  The zParam a
204a0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
204b0 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75  ame of the.** qu
204c0 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65  ery parameter we
204d0 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75   seek.  This rou
204e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
204f0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50   value of the zP
20500 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65  aram.** paramete
20510 72 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  r if it exists. 
20520 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
20530 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  r does not exist
20540 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
20550 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c  * returns a NULL
20560 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e   pointer..*/.con
20570 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
20580 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63  _uri_parameter(c
20590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
205a0 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  name, const char
205b0 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28   *zParam){.  if(
205c0 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
205d0 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72 65 74   zParam==0 ) ret
205e0 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61  urn 0;.  zFilena
205f0 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
20600 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
20610 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a   + 1;.  while( z
20620 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
20630 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d     int x = strcm
20640 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  p(zFilename, zPa
20650 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ram);.    zFilen
20660 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
20670 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
20680 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78  ) + 1;.    if( x
20690 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69  ==0 ) return zFi
206a0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c  lename;.    zFil
206b0 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
206c0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
206d0 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72  me) + 1;.  }.  r
206e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
206f0 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65  * Return a boole
20700 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71  an value for a q
20710 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
20720 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75  */.int sqlite3_u
20730 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74  ri_boolean(const
20740 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
20750 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
20760 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29  aram, int bDflt)
20770 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
20780 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
20790 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e  parameter(zFilen
207a0 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
207b0 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30  bDflt = bDflt!=0
207c0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73  ;.  return z ? s
207d0 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
207e0 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66  (z, bDflt) : bDf
207f0 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  lt;.}../*.** Ret
20800 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74  urn a 64-bit int
20810 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61  eger value for a
20820 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
20830 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
20840 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69  64 sqlite3_uri_i
20850 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68  nt64(.  const ch
20860 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
20870 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73    /* Filename as
20880 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e   passed to xOpen
20890 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
208a0 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20   *zParam,       
208b0 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72  /* URI parameter
208c0 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c   sought */.  sql
208d0 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74  ite3_int64 bDflt
208e0 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e         /* return
208f0 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   if parameter is
20900 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20   missing */.){. 
20910 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
20920 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
20930 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65  ameter(zFilename
20940 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c  , zParam);.  sql
20950 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20  ite3_int64 v;.  
20960 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33  if( z && sqlite3
20970 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
20980 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   &v)==SQLITE_OK 
20990 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
209a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
209b0 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
209c0 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
209d0 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
209e0 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
209f0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
20a00 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
20a10 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
20a20 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
20a30 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
20a40 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
20a50 74 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20  t iDb = zDbName 
20a60 3f 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  ? sqlite3FindDbN
20a70 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
20a80 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 69   : 0;.  return i
20a90 44 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61  Db<0 ? 0 : db->a
20aa0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a  Db[iDb].pBt;.}..
20ab0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
20ac0 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
20ad0 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
20ae0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
20af0 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
20b00 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
20b10 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
20b20 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
20b30 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
20b40 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
20b50 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
20b60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
20b70 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
20b80 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
20b90 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
20ba0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
20bb0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
20bc0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
20bd0 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
20be0 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
20bf0 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
20c00 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
20c10 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
20c20 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a  me(pBt) : 0;.}..
20c30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
20c40 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  f database is re
20c50 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20  ad-only or 0 if 
20c60 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74  read/write.  Ret
20c70 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20  urn -1 if.** no 
20c80 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78  such database ex
20c90 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
20ca0 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
20cb0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
20cc0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
20cd0 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
20ce0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20cf0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
20d00 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
20d10 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
20d20 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
20d30 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
20d40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
20d50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42  .  }.#endif.  pB
20d60 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
20d70 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
20d80 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
20d90 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
20da0 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74  eeIsReadonly(pBt
20db0 29 20 3a 20 2d 31 3b 0a 7d 0a 23 69 66 20 28 53  ) : -1;.}.#if (S
20dc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
20dd0 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
20de0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
20df0 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
20e00 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a 0a 2f  e3_private.h"../
20e10 2a 20 0a 2a 2a 20 54 65 73 74 69 6e 67 20 61 20  * .** Testing a 
20e20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 73 71  file path for sq
20e30 6c 69 74 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  lite locks held 
20e40 62 79 20 61 20 70 72 6f 63 65 73 73 20 49 44 2e  by a process ID.
20e50 20 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c   .** Returns SQL
20e60 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e  ITE_LOCKSTATE_ON
20e70 20 69 66 20 6c 6f 63 6b 73 20 61 72 65 20 70 72   if locks are pr
20e80 65 73 65 6e 74 20 6f 6e 20 70 61 74 68 0a 2a 2a  esent on path.**
20e90 20 74 68 61 74 20 77 6f 75 6c 64 20 70 72 65 76   that would prev
20ea0 65 6e 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ent writing to t
20eb0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
20ec0 69 6e 74 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63  int _sqlite3_loc
20ed0 6b 73 74 61 74 65 28 63 6f 6e 73 74 20 63 68 61  kstate(const cha
20ee0 72 20 2a 70 61 74 68 2c 20 70 69 64 5f 74 20 70  r *path, pid_t p
20ef0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  id){.  sqlite3 *
20f00 64 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 0a 20 20  db = NULL;.  .  
20f10 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  if( sqlite3_open
20f20 5f 76 32 28 70 61 74 68 2c 20 26 64 62 2c 20 53  _v2(path, &db, S
20f30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
20f40 4e 4c 59 2c 20 4e 55 4c 4c 29 20 3d 3d 20 53 51  NLY, NULL) == SQ
20f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4c  LITE_OK ){.    L
20f60 6f 63 6b 73 74 61 74 65 50 49 44 20 6c 6f 63 6b  ockstatePID lock
20f70 73 74 61 74 65 20 3d 20 7b 70 69 64 2c 20 2d 31  state = {pid, -1
20f80 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  };.    sqlite3_f
20f90 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
20fa0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  NULL, SQLITE_FCN
20fb0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44  TL_LOCKSTATE_PID
20fc0 2c 20 26 6c 6f 63 6b 73 74 61 74 65 29 3b 0a 20  , &lockstate);. 
20fd0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
20fe0 28 64 62 29 3b 0a 20 20 20 20 69 6e 74 20 73 74  (db);.    int st
20ff0 61 74 65 20 3d 20 6c 6f 63 6b 73 74 61 74 65 2e  ate = lockstate.
21000 73 74 61 74 65 3b 0a 20 20 20 20 72 65 74 75 72  state;.    retur
21010 6e 20 73 74 61 74 65 3b 0a 20 20 7d 0a 20 20 69  n state;.  }.  i
21020 66 28 20 4e 55 4c 4c 21 3d 64 62 20 29 7b 20 0a  f( NULL!=db ){ .
21030 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
21040 65 28 64 62 29 3b 20 2f 2a 20 6e 65 65 64 20 74  e(db); /* need t
21050 6f 20 63 6c 6f 73 65 20 65 76 65 6e 20 69 66 20  o close even if 
21060 6f 70 65 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  open returns an 
21070 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 0a 20 20 72  error */.  }.  r
21080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
21090 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  KSTATE_ERROR;.}.
210a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
210b0 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
210c0 50 49 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  PI */..#ifdef SQ
210d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
210e0 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  SHOT./*.** Obtai
210f0 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e  n a snapshot han
21100 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61 70  dle for the snap
21110 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73 65  shot of database
21120 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20 0a   zDb currently .
21130 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62 79  ** being read by
21140 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
21150 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  nt sqlite3_snaps
21160 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69 74  hot_get(.  sqlit
21170 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
21180 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71   char *zDb,.  sq
21190 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
211a0 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20  *ppSnapshot.){. 
211b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
211c0 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20  _ERROR;.#ifndef 
211d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
211e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
211f0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
21200 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
21210 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
21220 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
21230 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
21240 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
21250 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
21260 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
21270 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
21280 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mmit==0 ){.    i
21290 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
212a0 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
212b0 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
212c0 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a  ==0 || iDb>1 ){.
212d0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
212e0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
212f0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 30  pBt;.      if( 0
21300 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ==sqlite3BtreeIs
21310 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
21320 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21330 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
21340 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  ans(pBt, 0);.   
21350 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21370 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21380 50 61 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74  PagerSnapshotGet
21390 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
213a0 65 72 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73  er(pBt), ppSnaps
213b0 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hot);.        }.
213c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
213d0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
213e0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
213f0 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a  ex);.#endif   /*
21400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
21410 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
21420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
21430 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
21440 6e 20 6f 6e 20 74 68 65 20 73 6e 61 70 73 68 6f  n on the snapsho
21450 74 20 69 64 65 6e 64 69 66 69 65 64 20 62 79 20  t idendified by 
21460 70 53 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e  pSnapshot..*/.in
21470 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  t sqlite3_snapsh
21480 6f 74 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74  ot_open(.  sqlit
21490 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
214a0 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73   char *zDb, .  s
214b0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
214c0 2a 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20  *pSnapshot.){.  
214d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
214e0 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53  ERROR;.#ifndef S
214f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
21500 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21510 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
21520 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
21530 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
21540 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
21550 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
21560 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
21570 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
21580 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
21590 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
215a0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  it==0 ){.    int
215b0 20 69 44 62 3b 0a 20 20 20 20 69 44 62 20 3d 20   iDb;.    iDb = 
215c0 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
215d0 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  e(db, zDb);.    
215e0 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44  if( iDb==0 || iD
215f0 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72  b>1 ){.      Btr
21600 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
21610 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
21620 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
21630 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61  BtreeIsInReadTra
21640 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
21650 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21660 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e  agerSnapshotOpen
21670 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
21680 65 72 28 70 42 74 29 2c 20 70 53 6e 61 70 73 68  er(pBt), pSnapsh
21690 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ot);.        if(
216a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
216b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
216c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
216d0 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b  inTrans(pBt, 0);
216e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
216f0 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
21700 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65  pen(sqlite3Btree
21710 50 61 67 65 72 28 70 42 74 29 2c 20 30 29 3b 0a  Pager(pBt), 0);.
21720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21730 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
21740 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
21750 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
21760 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
21770 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
21780 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21790 0a 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20 6d  .** Recover as m
217a0 61 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61 73  any snapshots as
217b0 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
217c0 68 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73 6f  he wal file asso
217d0 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 73  ciated with.** s
217e0 63 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61 74  chema zDb of dat
217f0 61 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  abase db..*/.int
21800 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
21810 74 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74 65  t_recover(sqlite
21820 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
21830 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72  r *zDb){.  int r
21840 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
21850 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69 66  ;.  int iDb;.#if
21860 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21870 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c  _WAL..#ifdef SQL
21880 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
21890 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
218a0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
218b0 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
218c0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
218d0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
218e0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f..  sqlite3_mut
218f0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
21900 65 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ex);.  iDb = sql
21910 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
21920 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69  b, zDb);.  if( i
21930 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29  Db==0 || iDb>1 )
21940 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
21950 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
21960 70 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  pBt;.    if( 0==
21970 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
21980 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29  ReadTrans(pBt) )
21990 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
219a0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
219b0 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  ans(pBt, 0);.   
219c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
219d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
219e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
219f0 72 53 6e 61 70 73 68 6f 74 52 65 63 6f 76 65 72  rSnapshotRecover
21a00 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
21a10 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
21a20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
21a30 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
21a40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
21a50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
21a60 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
21a70 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
21a80 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
21a90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21aa0 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e 61 70 73  .** Free a snaps
21ab0 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74 61 69  hot handle obtai
21ac0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
21ad0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 29 2e  _snapshot_get().
21ae0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21af0 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 73  _snapshot_free(s
21b00 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
21b10 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73  *pSnapshot){.  s
21b20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6e 61  qlite3_free(pSna
21b30 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pshot);.}.#endif
21b40 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
21b50 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23  E_SNAPSHOT */..#
21b60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21b70 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
21b80 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69 76  _DIAGS./*.** Giv
21b90 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
21ba0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
21bb0 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 74 72 75  tion, return tru
21bc0 65 20 69 66 20 74 68 61 74 20 6f 70 74 69 6f 6e  e if that option
21bd0 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 61 6e 64  .** was used and
21be0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
21bf0 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20 63 61  *.** The name ca
21c00 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67  n optionally beg
21c10 69 6e 20 77 69 74 68 20 22 53 51 4c 49 54 45 5f  in with "SQLITE_
21c20 22 20 62 75 74 20 74 68 65 20 22 53 51 4c 49 54  " but the "SQLIT
21c30 45 5f 22 20 70 72 65 66 69 78 0a 2a 2a 20 69 73  E_" prefix.** is
21c40 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f   not required fo
21c50 72 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e  r a match..*/.in
21c60 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c  t sqlite3_compil
21c70 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e  eoption_used(con
21c80 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d  st char *zOptNam
21c90 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  e){.  int i, n;.
21ca0 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f    int nOpt;.  co
21cb0 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d  nst char **azCom
21cc0 70 69 6c 65 4f 70 74 3b 0a 20 0a 23 69 66 20 53  pileOpt;. .#if S
21cd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
21ce0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 7a 4f 70  _ARMOR.  if( zOp
21cf0 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tName==0 ){.    
21d00 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
21d10 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
21d20 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
21d30 69 66 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f  if..  azCompileO
21d40 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  pt = sqlite3Comp
21d50 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74  ileOptions(&nOpt
21d60 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
21d70 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61  3StrNICmp(zOptNa
21d80 6d 65 2c 20 22 53 51 4c 49 54 45 5f 22 2c 20 37  me, "SQLITE_", 7
21d90 29 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d 65 20  )==0 ) zOptName 
21da0 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  += 7;.  n = sqli
21db0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
21dc0 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e  Name);..  /* Sin
21dd0 63 65 20 6e 4f 70 74 20 69 73 20 6e 6f 72 6d 61  ce nOpt is norma
21de0 6c 6c 79 20 69 6e 20 73 69 6e 67 6c 65 20 64 69  lly in single di
21df0 67 69 74 73 2c 20 61 20 6c 69 6e 65 61 72 20 73  gits, a linear s
21e00 65 61 72 63 68 20 69 73 20 0a 20 20 2a 2a 20 61  earch is .  ** a
21e10 64 65 71 75 61 74 65 2e 20 4e 6f 20 6e 65 65 64  dequate. No need
21e20 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 73 65   for a binary se
21e30 61 72 63 68 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  arch. */.  for(i
21e40 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b 29  =0; i<nOpt; i++)
21e50 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
21e60 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61  3StrNICmp(zOptNa
21e70 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  me, azCompileOpt
21e80 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  [i], n)==0.     
21e90 26 26 20 73 71 6c 69 74 65 33 49 73 49 64 43 68  && sqlite3IsIdCh
21ea0 61 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ar((unsigned cha
21eb0 72 29 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69  r)azCompileOpt[i
21ec0 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  ][n])==0.    ){.
21ed0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
21ee0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21ef0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
21f00 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 63  eturn the N-th c
21f10 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
21f20 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49 66 20 4e  on string.  If N
21f30 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
21f40 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 4e 55  ,.** return a NU
21f50 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63  LL pointer..*/.c
21f60 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21f70 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  e3_compileoption
21f80 5f 67 65 74 28 69 6e 74 20 4e 29 7b 0a 20 20 69  _get(int N){.  i
21f90 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74  nt nOpt;.  const
21fa0 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c   char **azCompil
21fb0 65 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d 70 69 6c  eOpt;.  azCompil
21fc0 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  eOpt = sqlite3Co
21fd0 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f  mpileOptions(&nO
21fe0 70 74 29 3b 0a 20 20 69 66 28 20 4e 3e 3d 30 20  pt);.  if( N>=0 
21ff0 26 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20 20  && N<nOpt ){.   
22000 20 72 65 74 75 72 6e 20 61 7a 43 6f 6d 70 69 6c   return azCompil
22010 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72  eOpt[N];.  }.  r
22020 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
22030 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
22040 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
22050 49 41 47 53 20 2a 2f 0a                          IAGS */.