/ Hex Artifact Content
Login

Artifact 1054e4dbb4fcca84246ed48b35164a996f5a52daa56c275157a5d583c0e2cd00:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
1b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1b10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1b30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1b40: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b60: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1b70: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1b80: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1b90: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1ba0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1bb0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1bc0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1bd0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1be0: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1bf0: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1c00: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1c10: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1c20: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1c30: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1c40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c60: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1c70: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1c80: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1c90: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1ca0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1cb0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1cc0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1cd0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1ce0: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1cf0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1d00: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1d10: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1d20: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1d30: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1d40: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1d50: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1d60: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1d70: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1d80: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1d90: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1da0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1db0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1dc0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1dd0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1de0: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1df0: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1e00: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1e10: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1e20: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1e30: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1e40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1e50: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1e60: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1e70: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1e80: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1e90: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1ea0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1eb0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1ec0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1ed0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1ee0: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1ef0: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1f00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f10: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1f20: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1f30: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1f40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f50: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f70: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1f90: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1fa0: 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  ess = 1;.#ifdef 
1fb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
1fc0: 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20 20 20  LLOG.    {.     
1fd0: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
1fe0: 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67  ite3_init_sqllog
1ff0: 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 73 71  (void);.      sq
2000: 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f  lite3_init_sqllo
2010: 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  g();.    }.#endi
2020: 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71  f.    memset(&sq
2030: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
2040: 74 69 6f 6e 73 2c 20 30 2c 20 73 69 7a 65 6f 66  tions, 0, sizeof
2050: 28 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46  (sqlite3BuiltinF
2060: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
2070: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
2080: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
2090: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
20a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
20b0: 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29  sPCacheInit==0 )
20c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20d0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
20e0: 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20  lize();.    }.  
20f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2110: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2120: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2130: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
2140: 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20  lite3OsInit();. 
2150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2160: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2170: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
2180: 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71  eBufferSetup( sq
2190: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
21a0: 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20  g.pPage, .      
21b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
21c0: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20  lConfig.szPage, 
21d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
21e0: 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20  fig.nPage);.    
21f0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2200: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31  onfig.isInit = 1
2210: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2220: 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20 20  EXTRA_INIT.     
2230: 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d   bRunExtraInit =
2240: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
2250: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2260: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
2270: 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ess = 0;.  }.  s
2280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2290: 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ve(sqlite3Global
22a0: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
22b0: 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63  x);..  /* Go bac
22c0: 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74  k under the stat
22d0: 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65  ic mutex and cle
22e0: 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73  an up the recurs
22f0: 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74  ive.  ** mutex t
2300: 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f  o prevent a reso
2310: 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a  urce leak..  */.
2320: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2330: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
2340: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2350: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2360: 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c  tex--;.  if( sql
2370: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2380: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d  .nRefInitMutex<=
2390: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
23a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
23b0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
23c0: 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
23d0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
23e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
23f0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
2400: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2410: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
2420: 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tex = 0;.  }.  s
2430: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2440: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
2450: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2460: 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74   is just a sanit
2470: 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  y check to make 
2480: 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a  sure SQLite has.
2490: 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c    ** been compil
24a0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  ed correctly.  I
24b0: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
24c0: 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c  o run this code,
24d0: 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   but.  ** we don
24e0: 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69  't want to run i
24f0: 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20  t too often and 
2500: 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c  soak up CPU cycl
2510: 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72  es for no.  ** r
2520: 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75  eason.  So we ru
2530: 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67  n it once during
2540: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
2550: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
2560: 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c  EBUG.#ifndef SQL
2570: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
2580: 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69  G_POINT.  /* Thi
2590: 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64  s section of cod
25a0: 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74  e's only "output
25b0: 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28  " is via assert(
25c0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f  ) statements. */
25d0: 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49  .  if ( rc==SQLI
25e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34  TE_OK ){.    u64
25f0: 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c   x = (((u64)1)<<
2600: 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c  63)-1;.    doubl
2610: 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e y;.    assert(
2620: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20  sizeof(x)==8);. 
2630: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
2640: 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b  (x)==sizeof(y));
2650: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20  .    memcpy(&y, 
2660: 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65  &x, 8);.    asse
2670: 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  rt( sqlite3IsNaN
2680: 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (y) );.  }.#endi
2690: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  f.#endif..  /* D
26a0: 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  o extra initiali
26b0: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71  zation steps req
26c0: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51  uested by the SQ
26d0: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
26e0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
26f0: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  e option..  */.#
2700: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2710: 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52  RA_INIT.  if( bR
2720: 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20  unExtraInit ){. 
2730: 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58     int SQLITE_EX
2740: 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63  TRA_INIT(const c
2750: 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  har*);.    rc = 
2760: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2770: 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  T(0);.  }.#endif
2780: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2790: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65  ../*.** Undo the
27a0: 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69   effects of sqli
27b0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
27c0: 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63  .  Must not be c
27d0: 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74  alled while.** t
27e0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
27f0: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ding database co
2800: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
2810: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
2820: 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20  or.** while any 
2830: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69  part of SQLite i
2840: 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  s otherwise in u
2850: 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64  se in any thread
2860: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2870: 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  ne is not thread
2880: 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73  safe.  But it is
2890: 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20   safe to invoke 
28a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
28b0: 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  on when SQLite i
28c0: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
28d0: 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20  own.  If SQLite 
28e0: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
28f0: 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  down.** when thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
2910: 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  oked, then this 
2920: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2930: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2940: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
2950: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64  down(void){.#ifd
2960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2970: 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  SD.  int rc = sq
2980: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
2990: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
29a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
29c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
29d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
29e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a  onfig.isInit ){.
29f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2a00: 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20  TRA_SHUTDOWN.   
2a10: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54   void SQLITE_EXT
2a20: 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64  RA_SHUTDOWN(void
2a30: 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58  );.    SQLITE_EX
2a40: 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a  TRA_SHUTDOWN();.
2a50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2a60: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
2a70: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
2a80: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
2a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2aa0: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2ab0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2ac0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ad0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2ae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2af0: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2b00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b10: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2b20: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2b30: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2b40: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b50: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2b60: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
2b70: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b80: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b90: 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  Init = 0;..#ifnd
2ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2bb0: 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52  HUTDOWN_DIRECTOR
2bc0: 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68  IES.    /* The h
2bd0: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61  eap subsystem ha
2be0: 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64  s now been shutd
2bf0: 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61  own and these va
2c00: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2c10: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e  d.    ** to be N
2c20: 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20  ULL or point to 
2c30: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2c40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2c50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a  lite3_malloc(),.
2c60: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2c70: 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20  ld rely on that 
2c80: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20  heap subsystem; 
2c90: 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20  therefore, make 
2ca0: 73 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a  sure these.    *
2cb0: 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20  * values cannot 
2cc0: 72 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65  refer to heap me
2cd0: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75  mory that was ju
2ce0: 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  st invalidated w
2cf0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68  hen the.    ** h
2d00: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61  eap subsystem wa
2d10: 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  s shutdown.  Thi
2d20: 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69  s is only done i
2d30: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  f the current ca
2d40: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ll to.    ** thi
2d50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  s function resul
2d60: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20  ted in the heap 
2d70: 73 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c  subsystem actual
2d80: 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77  ly being shutdow
2d90: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  n..    */.    sq
2da0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2db0: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tory = 0;.    sq
2dc0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2dd0: 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tory = 0;.#endif
2de0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2e00: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2e10: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2e20: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2e30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2e40: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
2e50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2e60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e70: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
2e80: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
2e90: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
2ea0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
2eb0: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
2ec0: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
2ed0: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
2ee0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2ef0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
2f00: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2f10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
2f20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2f30: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2f40: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
2f50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2f60: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
2f70: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
2f80: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
2f90: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
2fa0: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
2fb0: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
2fc0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
2fd0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
2fe0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
2ff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
3000: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
3010: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
3020: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
3030: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
3040: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
3050: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
3060: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
3070: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3080: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
3090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
30a0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
30b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
30c0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
30d0: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
30e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
30f0: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
3100: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
3110: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
3120: 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23  ompile..    */.#
3130: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3140: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3150: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3160: 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  FE>0  /* IMP: R-
3170: 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20  54466-46756 */. 
3180: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3190: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
31a0: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AD: {.      /* E
31b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
31c0: 37 34 38 2d 31 39 30 39 36 20 54 68 69 73 20 6f  748-19096 This o
31d0: 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74  ption sets the t
31e0: 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f  hreading mode to
31f0: 0a 20 20 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65  .      ** Single
3200: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
3210: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3220: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3230: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3240: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
3250: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3260: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3270: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3280: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3290: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
32a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
32c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
32d0: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
32e0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
32f0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32 30   /* IMP: R-20520
3300: 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63 61  -54086 */.    ca
3310: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3320: 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a  _MULTITHREAD: {.
3330: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3340: 45 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d 34 32  E-OF: R-14374-42
3350: 34 36 38 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  468 This option 
3360: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3370: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3380: 20 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64   ** Multi-thread
3390: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
33a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33b0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20  CoreMutex = 1;  
33c0: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
33d0: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
33e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
33f0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
3400: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
3410: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
3420: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
3430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3440: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3450: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3460: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3470: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3480: 20 52 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a   R-59593-21810 *
3490: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
34a0: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
34b0: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
34c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
34d0: 31 32 32 30 2d 35 31 38 30 30 20 54 68 69 73 20  1220-51800 This 
34e0: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
34f0: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
3500: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 65 72 69 61  o.      ** Seria
3510: 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lized. */.      
3520: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3530: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
3540: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
3550: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3570: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
3580: 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e  utex = 1;  /* En
3590: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
35a0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
35b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
35c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
35d0: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
35e0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
35f0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3600: 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34 38 37  IMP: R-63666-487
3610: 35 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  55 */.    case S
3620: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
3630: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EX: {.      /* S
3640: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
3650: 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c  ative mutex impl
3660: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3670: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3680: 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20  lConfig.mutex = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
36b0: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
36c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
36d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
36e0: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
36f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3700: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  FE>0 /* IMP: R-1
3710: 34 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20  4450-37597 */.  
3720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3730: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
3740: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
3750: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
3760: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
3770: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
3780: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3790: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
37a0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
37b0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20  Config.mutex;.  
37c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
37e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
37f0: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
3800: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3810: 52 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68  R-55594-21030 Th
3820: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3830: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3840: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3850: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3860: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3870: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3880: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3890: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
38a0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
38b0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65  The argument spe
38c0: 63 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69  cifies alternati
38d0: 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d  ve.      ** low-
38e0: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
38f0: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3900: 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70   to be used in p
3910: 6c 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  lace of the memo
3920: 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ry.      ** allo
3930: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3940: 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74  built into SQLit
3950: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
3960: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3970: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3980: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3990: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
39a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
39b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
39c0: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
39d0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
39e0: 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31  OF: R-51213-4641
39f0: 34 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  4 The SQLITE_CON
3a00: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70  FIG_GETMALLOC op
3a10: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3a20: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3a30: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
3a40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3a50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
3a60: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
3a70: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3a80: 63 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74  cture. The sqlit
3a90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3aa0: 74 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20  tructure is.    
3ab0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
3ad0: 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c  efined memory al
3ae0: 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  location routine
3af0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  s. */.      if( 
3b00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3b10: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30  fig.m.xMalloc==0
3b20: 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74   ) sqlite3MemSet
3b30: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3b40: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3b50: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3b60: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3b70: 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20  alConfig.m;.    
3b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ba0: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
3bb0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3bc0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35  ENCE-OF: R-61275
3bd0: 2d 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54  -35157 The SQLIT
3be0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
3bf0: 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a  US option takes.
3c00: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3c10: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65  argument of type
3c20: 20 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65   int, interprete
3c30: 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20  d as a boolean, 
3c40: 77 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20  which enables.  
3c50: 20 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c      ** or disabl
3c60: 65 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f  es the collectio
3c70: 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  n of memory allo
3c80: 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  cation statistic
3c90: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
3ca0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3cb0: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
3cc0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ce0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3cf0: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b  ONFIG_SCRATCH: {
3d00: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3d10: 43 45 2d 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36  CE-OF: R-08404-6
3d20: 30 38 38 37 20 54 68 65 72 65 20 61 72 65 20 74  0887 There are t
3d30: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
3d40: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
3d50: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
3d60: 3a 20 41 20 70 6f 69 6e 74 65 72 20 61 6e 20 38  : A pointer an 8
3d70: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3d80: 6d 6f 72 79 20 62 75 66 66 65 72 20 66 72 6f 6d  mory buffer from
3d90: 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20  .      ** which 
3da0: 74 68 65 20 73 63 72 61 74 63 68 20 61 6c 6c 6f  the scratch allo
3db0: 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  cations will be 
3dc0: 64 72 61 77 6e 2c 20 74 68 65 20 73 69 7a 65 20  drawn, the size 
3dd0: 6f 66 20 65 61 63 68 20 73 63 72 61 74 63 68 0a  of each scratch.
3de0: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3df0: 69 6f 6e 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ion (sz), and th
3e00: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
3e10: 20 6f 66 20 73 63 72 61 74 63 68 20 61 6c 6c 6f   of scratch allo
3e20: 63 61 74 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a  cations (N). */.
3e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3e40: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
3e50: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
3e60: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3e70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3e80: 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61  g.szScratch = va
3e90: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3eb0: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
3ec0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3ed0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3ef0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3f00: 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  AGECACHE: {.    
3f10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3f20: 3a 20 52 2d 31 38 37 36 31 2d 33 36 36 30 31 20  : R-18761-36601 
3f30: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
3f40: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
3f50: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
3f60: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 41  FIG_PAGECACHE: A
3f70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 38 2d 62 79   pointer to 8-by
3f80: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3f90: 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20  y (pMem),.      
3fa0: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65  ** the size of e
3fb0: 61 63 68 20 70 61 67 65 20 63 61 63 68 65 20 6c  ach page cache l
3fc0: 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ine (sz), and th
3fd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
3fe0: 65 20 6c 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  e lines.      **
3ff0: 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73   (N). */.      s
4000: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4010: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
4020: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
4030: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4040: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
4050: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
4080: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4090: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
40a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
40c0: 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20  CACHE_HDRSZ: {. 
40d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
40e0: 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32 37 33  -OF: R-39100-273
40f0: 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  17 The SQLITE_CO
4100: 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53  NFIG_PCACHE_HDRS
4110: 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  Z option takes. 
4120: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
4130: 20 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68   parameter which
4140: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4150: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
4160: 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20 20 20  writes into.    
4170: 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65    ** that intege
4180: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
4190: 65 78 74 72 61 20 62 79 74 65 73 20 70 65 72 20  extra bytes per 
41a0: 70 61 67 65 20 72 65 71 75 69 72 65 64 20 66 6f  page required fo
41b0: 72 20 65 61 63 68 20 70 61 67 65 0a 20 20 20 20  r each page.    
41c0: 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43    ** in SQLITE_C
41d0: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e  ONFIG_PAGECACHE.
41e0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
41f0: 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20  g(ap, int*) = . 
4200: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4210: 48 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28  HeaderSizeBtree(
4220: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
4230: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4240: 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20 20 20  cache() +.      
4250: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4260: 72 53 69 7a 65 50 63 61 63 68 65 31 28 29 3b 0a  rSizePcache1();.
4270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4280: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4290: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
42a0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
42b0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
42d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
42e0: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
42f0: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
4300: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
4310: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
4320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4330: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4340: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
4350: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  E2: {.      /* E
4360: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
4370: 33 32 35 2d 34 38 33 37 38 20 54 68 65 20 53 51  325-48378 The SQ
4380: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
4390: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
43a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
43b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
43c0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
43d0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
43e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
43f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68     ** object. Th
4400: 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63 69 66  is object specif
4410: 69 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63  ies the interfac
4420: 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20 70 61  e to a custom pa
4430: 67 65 20 63 61 63 68 65 0a 20 20 20 20 20 20 2a  ge cache.      *
4440: 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
4450: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
4460: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4470: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
4480: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
4490: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
44a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
44c0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
44d0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
44e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
44f0: 32 32 30 33 35 2d 34 36 31 38 32 20 54 68 65 20  22035-46182 The 
4500: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4510: 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20  TPCACHE2 option 
4520: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
4530: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4540: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
4550: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
4560: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4570: 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  2.      ** objec
4580: 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73  t. SQLite copies
4590: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
45a0: 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65  page cache imple
45b0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20  mentation into. 
45c0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a       ** that obj
45d0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ect. */.      if
45e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
45f0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
4600: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
4610: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
4620: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
4630: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
4640: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
4650: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
4660: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
4670: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
4680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4690: 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d   }../* EVIDENCE-
46a0: 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32 39 31  OF: R-06626-1291
46b0: 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  1 The SQLITE_CON
46c0: 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20  FIG_HEAP option 
46d0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  is only.** avail
46e0: 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69  able if SQLite i
46f0: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
4700: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 45 4e  either SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a  ABLE_MEMSYS3 or.
4720: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
4730: 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72 65 74  _MEMSYS5 and ret
4740: 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f  urns SQLITE_ERRO
4750: 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68  R if invoked oth
4760: 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64  erwise. */.#if d
4770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4780: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
4790: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
47a0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
47b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
47c0: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
47d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
47e0: 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34 32 31  -OF: R-19854-421
47f0: 32 36 20 54 68 65 72 65 20 61 72 65 20 74 68 72  26 There are thr
4800: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
4810: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4820: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41 6e 20  CONFIG_HEAP: An 
4830: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 70  8-byte aligned p
4840: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65  ointer to the me
4850: 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20 20 20  mory, the.      
4860: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
4870: 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79  es in the memory
4880: 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74 68 65   buffer, and the
4890: 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   minimum allocat
48a0: 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20 20 20  ion size..      
48b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
48c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
48d0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
48e0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
48f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4900: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
4910: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4930: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
4940: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
4950: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4960: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4970: 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eq<1 ){.        
4980: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4990: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20  fig.mnReq = 1;. 
49a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
49b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
49c0: 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29  ig.mnReq>(1<<12)
49d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
49e0: 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73  ap min request s
49f0: 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20  ize at 2^12 */. 
4a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
4a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
4a20: 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20   = (1<<12);.    
4a30: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
4a40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4a50: 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
4a60: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
4a70: 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36  CE-OF: R-49920-6
4a80: 30 31 38 39 20 49 66 20 74 68 65 20 66 69 72 73  0189 If the firs
4a90: 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d  t pointer (the m
4aa0: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 0a 20  emory pointer). 
4ab0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c         ** is NUL
4ac0: 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 72  L, then SQLite r
4ad0: 65 76 65 72 74 73 20 74 6f 20 75 73 69 6e 67 20  everts to using 
4ae0: 69 74 73 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  its default memo
4af0: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20  ry allocator.   
4b00: 20 20 20 20 20 2a 2a 20 28 74 68 65 20 73 79 73       ** (the sys
4b10: 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70  tem malloc() imp
4b20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e  lementation), un
4b30: 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f 72 20  doing any prior 
4b40: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20  invocation of.  
4b50: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4b60: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20  CONFIG_MALLOC.. 
4b70: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4b80: 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 73 71 6c    ** Setting sql
4b90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4ba0: 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20  .m to all zeros 
4bb0: 77 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f  will cause mallo
4bc0: 63 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  c to.        ** 
4bd0: 72 65 76 65 72 74 20 74 6f 20 69 74 73 20 64 65  revert to its de
4be0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
4bf0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
4c00: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
4c10: 73 20 72 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f  s run.        */
4c20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
4c30: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
4c40: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
4c50: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
4c60: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
4c70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4c80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4c90: 52 2d 36 31 30 30 36 2d 30 38 39 31 38 20 49 66  R-61006-08918 If
4ca0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e   the memory poin
4cb0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
4cc0: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
4cd0: 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20   ** alternative 
4ce0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4cf0: 20 69 73 20 65 6e 67 61 67 65 64 20 74 6f 20 68   is engaged to h
4d00: 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c  andle all of SQL
4d10: 69 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ites.        ** 
4d20: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4d30: 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64  n needs. */.#ifd
4d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d50: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
4d60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4d70: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4d80: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
4d90: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4da0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4db0: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
4dc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4dd0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4de0: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
4df0: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
4e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e10: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
4e20: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4e30: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
4e40: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4e50: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
4e60: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
4e70: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4e90: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
4ea0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ec0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
4ed0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
4ee0: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
4ef0: 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72  tion and its fir
4f00: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
4f10: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
4f20: 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e  is NULL.  Loggin
4f30: 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66  g is disabled if
4f40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f   the function po
4f50: 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  inter is.    ** 
4f60: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
4f70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4f80: 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  FIG_LOG: {.     
4f90: 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
4fa0: 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
4fb0: 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
4fc0: 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
4fd0: 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
4fe0: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
4ff0: 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
5000: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5010: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
5020: 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76  rg(ap, void(*)(v
5030: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
5040: 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f  har*));.      */
5050: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
5060: 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28  oid(*LOGFUNC_t)(
5070: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
5080: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
5090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
50a0: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
50b0: 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a  ap, LOGFUNC_t);.
50c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72  balConfig.pLogAr
50e0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
50f0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  oid*);.      bre
5100: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5110: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5120: 2d 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65  -55548-33817 The
5130: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65   compile-time se
5140: 74 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69  tting for URI fi
5150: 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63  lenames.    ** c
5160: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74  an be changed at
5170: 20 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e   start-time usin
5180: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  g the.    ** sql
5190: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
51a0: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29  TE_CONFIG_URI,1)
51b0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
51c0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
51d0: 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63  _CONFIG_URI,0) c
51e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c  onfiguration cal
51f0: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
5200: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5210: 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f  G_URI: {.      /
5220: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5230: 2d 32 35 34 35 31 2d 36 31 31 32 35 20 54 68 65  -25451-61125 The
5240: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5250: 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  RI option takes 
5260: 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a  a single.      *
5270: 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  * argument of ty
5280: 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a  pe int. If non-z
5290: 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61  ero, then URI ha
52a0: 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c  ndling is global
52b0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  ly.      ** enab
52c0: 6c 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61  led. If the para
52d0: 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  meter is zero, t
52e0: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
52f0: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5300: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20     ** disabled. 
5310: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5320: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
5330: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
5340: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
5350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5360: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5370: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
5380: 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20  EX_SCAN: {.     
5390: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
53a0: 20 52 2d 33 36 35 39 32 2d 30 32 37 37 32 20 54   R-36592-02772 T
53b0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
53c0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53d0: 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70  SCAN.      ** op
53e0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
53f0: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
5400: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6e  ment which is in
5410: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 20  terpreted as a. 
5420: 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20       ** boolean 
5430: 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 61 62  in order to enab
5440: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
5450: 65 20 75 73 65 20 6f 66 20 63 6f 76 65 72 69 6e  e use of coverin
5460: 67 20 69 6e 64 69 63 65 73 20 66 6f 72 0a 20 20  g indices for.  
5470: 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c      ** full tabl
5480: 65 20 73 63 61 6e 73 20 69 6e 20 74 68 65 20 71  e scans in the q
5490: 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20  uery optimizer. 
54a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
54b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
54c0: 65 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70  eCis = va_arg(ap
54d0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
54e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
54f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5500: 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65  _SQLLOG.    case
5510: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
5520: 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74  QLLOG: {.      t
5530: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c  ypedef void(*SQL
5540: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5550: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
5560: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20  t char*, int);. 
5570: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5580: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
5590: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51   = va_arg(ap, SQ
55a0: 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20  LLOGFUNC_t);.   
55b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
55c0: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
55d0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
55e0: 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72  oid *);.      br
55f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5600: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
5610: 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53  TE_CONFIG_MMAP_S
5620: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IZE: {.      /* 
5630: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5640: 38 30 36 33 2d 33 38 32 35 38 20 53 51 4c 49 54  8063-38258 SQLIT
5650: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
5660: 5a 45 20 74 61 6b 65 73 20 74 77 6f 20 36 34 2d  ZE takes two 64-
5670: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  bit.      ** int
5680: 65 67 65 72 20 28 73 71 6c 69 74 65 33 5f 69 6e  eger (sqlite3_in
5690: 74 36 34 29 20 76 61 6c 75 65 73 20 74 68 61 74  t64) values that
56a0: 20 61 72 65 20 74 68 65 20 64 65 66 61 75 6c 74   are the default
56b0: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
56c0: 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 64  .      ** (the d
56d0: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 66  efault setting f
56e0: 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73  or PRAGMA mmap_s
56f0: 69 7a 65 29 20 61 6e 64 20 74 68 65 20 6d 61 78  ize) and the max
5700: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20  imum allowed.   
5710: 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20     ** mmap size 
5720: 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  limit. */.      
5730: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
5740: 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
5750: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
5760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5770: 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76  int64 mxMmap = v
5780: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
5790: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
57a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
57b0: 52 2d 35 33 33 36 37 2d 34 33 31 39 30 20 49 66  R-53367-43190 If
57c0: 20 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74   either argument
57d0: 20 74 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   to this option 
57e0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65 67 61  is.      ** nega
57f0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 61 74 20  tive, then that 
5800: 61 72 67 75 6d 65 6e 74 20 69 73 20 63 68 61 6e  argument is chan
5810: 67 65 64 20 74 6f 20 69 74 73 20 63 6f 6d 70 69  ged to its compi
5820: 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c 74 2e  le-time default.
5830: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5840: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
5850: 52 2d 33 34 39 39 33 2d 34 35 30 33 31 20 54 68  R-34993-45031 Th
5860: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5870: 64 20 6d 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c  d mmap size will
5880: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c   be.      ** sil
5890: 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 20  ently truncated 
58a0: 69 66 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  if necessary so 
58b0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
58c0: 20 65 78 63 65 65 64 20 74 68 65 0a 20 20 20 20   exceed the.    
58d0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
58e0: 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  e maximum mmap s
58f0: 69 7a 65 20 73 65 74 20 62 79 20 74 68 65 20 53  ize set by the S
5900: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
5910: 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  IZE.      ** com
5920: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
5930: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5940: 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c   if( mxMmap<0 ||
5950: 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d   mxMmap>SQLITE_M
5960: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a  AX_MMAP_SIZE ){.
5970: 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d          mxMmap =
5980: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
5990: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _SIZE;.      }. 
59a0: 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c       if( szMmap<
59b0: 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  0 ) szMmap = SQL
59c0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
59d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28  _SIZE;.      if(
59e0: 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20   szMmap>mxMmap) 
59f0: 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b  szMmap = mxMmap;
5a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
5a20: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a40: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73  onfig.szMmap = s
5a50: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65  zMmap;.      bre
5a60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53  ak;.    }..#if S
5a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20  QLITE_OS_WIN && 
5a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5a90: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20  IN32_MALLOC) /* 
5aa0: 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35 35 38  IMP: R-04780-558
5ab0: 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  15 */.    case S
5ac0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
5ad0: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
5ae0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5af0: 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30 33 33  -OF: R-34926-033
5b00: 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  60 SQLITE_CONFIG
5b10: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 20  _WIN32_HEAPSIZE 
5b20: 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74 0a 20  takes a 32-bit. 
5b30: 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64       ** unsigned
5b40: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74   integer value t
5b50: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
5b60: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
5b70: 66 20 74 68 65 20 63 72 65 61 74 65 64 0a 20 20  f the created.  
5b80: 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a      ** heap. */.
5b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5ba0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
5bb0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5bc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5bd0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5bf0: 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20  NFIG_PMASZ: {.  
5c00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5c10: 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20  lConfig.szPma = 
5c20: 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
5c30: 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
5c40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5c50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5c60: 4e 46 49 47 5f 53 54 4d 54 4a 52 4e 4c 5f 53 50  NFIG_STMTJRNL_SP
5c70: 49 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILL: {.      sql
5c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5c90: 2e 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 76 61  .nStmtSpill = va
5ca0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cc0: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
5cd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5ce0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
5cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5d00: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
5d10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5d20: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
5d30: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5d40: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
5d50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
5d60: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d70: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
5d80: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
5d90: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
5da0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
5db0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
5dc0: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
5dd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5de0: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
5df0: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
5e00: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
5e10: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5e20: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
5e30: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
5e40: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
5e50: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
5e60: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
5e70: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
5e80: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
5e90: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
5ea0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
5eb0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
5ec0: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
5ed0: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
5ee0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
5ef0: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
5f00: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
5f10: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
5f20: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66  z, int cnt){.#if
5f30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5f40: 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69  _LOOKASIDE.  voi
5f50: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
5f60: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
5f70: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
5f80: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
5f90: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
5fa0: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
5fb0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
5fc0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
5fd0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
5fe0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
5ff0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
6000: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
6010: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
6020: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
6030: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6040: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6050: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6060: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6070: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6080: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
6090: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
60a0: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
60b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
60c0: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
60d0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
60e0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
60f0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
6100: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
6110: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
6120: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
6130: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
6140: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
6150: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
6160: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
6170: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
6180: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
6190: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
61a0: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
61b0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
61c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
61d0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
61e0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
61f0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
6200: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
6210: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
6220: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
6230: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
6240: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6250: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
6260: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6270: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
6280: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
6290: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
62a0: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
62b0: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
62c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
62d0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
62e0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
62f0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
6300: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
6310: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
6320: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6330: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
6340: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
6350: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
6360: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
6370: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
6380: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
6390: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
63a0: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
63b0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
63c0: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
63d0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
63e0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
63f0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6400: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
6410: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
6420: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
6430: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6440: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
6450: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
6460: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6470: 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20  .pStart = db;.  
6480: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6490: 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64  pEnd = db;.    d
64a0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
64b0: 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 64  sable = 1;.    d
64c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
64d0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
64e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
64f0: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20  _OMIT_LOOKASIDE 
6500: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
6510: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6520: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
6530: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6540: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
6550: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
6560: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
6570: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
6580: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
6590: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
65a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
65b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
65c0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
65d0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
65e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
65f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
6600: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  f.  return db->m
6610: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
6620: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
6630: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
6640: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
6650: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
6660: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
6670: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
6680: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
6690: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  *db){.  int i;..
66a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
66b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
66c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
66d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
66e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
66f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6700: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6710: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6720: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6730: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6750: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6760: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6770: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6780: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
6790: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
67a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
67b0: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
67c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
67d0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
67e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
67f0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6810: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6820: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
6830: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6840: 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74  * Flush any dirt
6850: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
6860: 61 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61  ager-cache for a
6870: 6e 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ny attached data
6880: 62 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e  base.** to disk.
6890: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
68a0: 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71  db_cacheflush(sq
68b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
68c0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
68d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
68e0: 20 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a   bSeenBusy = 0;.
68f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6900: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6910: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6920: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6930: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6940: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
6950: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
6960: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6970: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
6980: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
6990: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
69a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
69b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
69c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
69d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
69e0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
69f0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
6a00: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
6a10: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
6a20: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
6a30: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
6a40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6a50: 65 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b  erFlush(pPager);
6a60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6a70: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
6a80: 20 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20        bSeenBusy 
6a90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
6aa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6ab0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6ac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6ad0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6ae0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6af0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6b00: 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
6b10: 54 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75  TE_OK && bSeenBu
6b20: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
6b30: 59 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Y : rc);.}../*.*
6b40: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
6b50: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
6b60: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
6b70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
6b80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6b90: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
6ba0: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
6bb0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6bc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
6bd0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
6be0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
6bf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6c00: 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41  BCONFIG_MAINDBNA
6c10: 4d 45 3a 20 7b 0a 20 20 20 20 20 20 64 62 2d 3e  ME: {.      db->
6c20: 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20  aDb[0].zDbSName 
6c30: 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72  = va_arg(ap,char
6c40: 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  *);.      rc = S
6c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6c60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6c70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
6c80: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
6c90: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
6ca0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
6cb0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
6cc0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
6cd0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
6ce0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6cf0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
6d00: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
6d10: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
6d20: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6d30: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
6d40: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
6d60: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
6d70: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
6d80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6d90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
6da0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
6db0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
6dc0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
6dd0: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
6de0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
6df0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
6e00: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
6e10: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
6e20: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
6e30: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
6e40: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6e50: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6e60: 45 5f 46 4b 45 59 2c 20 20 20 20 20 20 20 20 20  E_FKEY,         
6e70: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
6e80: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
6e90: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6ea0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
6eb0: 47 45 52 2c 20 20 20 20 20 20 20 20 53 51 4c 49  GER,        SQLI
6ec0: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
6ed0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
6ee0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
6ef0: 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e  NABLE_FTS3_TOKEN
6f00: 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46 74 73  IZER, SQLITE_Fts
6f10: 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c 0a 20  3Tokenizer  },. 
6f20: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
6f30: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
6f40: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 20  LOAD_EXTENSION, 
6f50: 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
6f60: 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 20 20  sion  },.       
6f70: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
6f80: 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c  IG_NO_CKPT_ON_CL
6f90: 4f 53 45 2c 20 20 20 20 20 20 53 51 4c 49 54 45  OSE,      SQLITE
6fa0: 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 20 20  _NoCkptOnClose  
6fb0: 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
6fc0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6fd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
6fe0: 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d  ITE_ERROR; /* IM
6ff0: 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32  P: R-42790-23372
7000: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
7010: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
7020: 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  FlagOp); i++){. 
7030: 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61 67         if( aFlag
7040: 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a  Op[i].op==op ){.
7050: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e            int on
7060: 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  off = va_arg(ap,
7070: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20   int);.         
7080: 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f   int *pRes = va_
7090: 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
70a0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64           int old
70b0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
70c0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
70d0: 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20   onoff>0 ){.    
70e0: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
70f0: 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e  s |= aFlagOp[i].
7100: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
7110: 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d  }else if( onoff=
7120: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7130: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
7140: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
7150: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7160: 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c         if( oldFl
7170: 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29  ags!=db->flags )
7180: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
7190: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
71a0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
71b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
71c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
71d0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
71e0: 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c   *pRes = (db->fl
71f0: 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d  ags & aFlagOp[i]
7200: 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20  .mask)!=0;.     
7210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7220: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7230: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
7240: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7250: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7260: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
7270: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
7280: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
7290: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
72a0: 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e  he buffer z[0..n
72b0: 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  -1] contains all
72c0: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
72d0: 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73  ic int allSpaces
72e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
72f0: 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28  int n){.  while(
7300: 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
7310: 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ' ' ){ n--; }.  
7320: 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a  return n==0;.}..
7330: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7340: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
7350: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ing function nam
7360: 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63  ed "BINARY" whic
7370: 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61  h is always.** a
7380: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
7390: 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61  If the padFlag a
73a0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
73b0: 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70  ULL then space p
73c0: 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e  adding at the en
73d0: 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20  d.** of strings 
73e0: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  is ignored.  Thi
73f0: 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  s implements the
7400: 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e   RTRIM collation
7410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7420: 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  binCollFunc(.  v
7430: 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20  oid *padFlag,.  
7440: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7450: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7460: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7470: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7480: 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e    int rc, n;.  n
7490: 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f   = nKey1<nKey2 ?
74a0: 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a   nKey1 : nKey2;.
74b0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
74c0: 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20  : R-65033-28449 
74d0: 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e  The built-in BIN
74e0: 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f  ARY collation co
74f0: 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69  mpares.  ** stri
7500: 6e 67 73 20 62 79 74 65 20 62 79 20 62 79 74 65  ngs byte by byte
7510: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d   using the memcm
7520: 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  p() function fro
7530: 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 43  m the standard C
7540: 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a  .  ** library. *
7550: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  /.  assert( pKey
7560: 31 20 26 26 20 70 4b 65 79 32 20 29 3b 0a 20 20  1 && pKey2 );.  
7570: 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79  rc = memcmp(pKey
7580: 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20  1, pKey2, n);.  
7590: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
75a0: 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20   if( padFlag.   
75b0: 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28    && allSpaces((
75c0: 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c  (char*)pKey1)+n,
75d0: 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26   nKey1-n).     &
75e0: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
75f0: 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b  ar*)pKey2)+n, nK
7600: 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20  ey2-n).    ){.  
7610: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
7620: 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37 33  OF: R-31624-2473
7630: 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65 20  7 RTRIM is like 
7640: 42 49 4e 41 52 59 20 65 78 63 65 70 74 20 74 68  BINARY except th
7650: 61 74 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a  at extra.      *
7660: 2a 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20  * spaces at the 
7670: 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73 74  end of either st
7680: 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e  ring do not chan
7690: 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20 49  ge the result. I
76a0: 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  n other.      **
76b0: 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73 20   words, strings 
76c0: 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71 75  will compare equ
76d0: 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  al to one anothe
76e0: 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65  r as long as the
76f0: 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65  y.      ** diffe
7700: 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75  r only in the nu
7710: 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73 20 61  mber of spaces a
7720: 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20 20  t the end..     
7730: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
7740: 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20       rc = nKey1 
7750: 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20  - nKey2;.    }. 
7760: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7770: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72  }../*.** Another
7780: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
7790: 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f  ing sequence: NO
77a0: 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  CASE. .**.** Thi
77b0: 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  s collating sequ
77c0: 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64  ence is intended
77d0: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
77e0: 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e  "case independen
77f0: 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22  t.** comparison"
7800: 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c  . SQLite's knowl
7810: 65 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e  edge of upper an
7820: 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75  d lower case equ
7830: 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65  ivalents.** exte
7840: 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20  nds only to the 
7850: 32 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73  26 characters us
7860: 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73  ed in the Englis
7870: 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a  h language..**.*
7880: 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20  * At the moment 
7890: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
78a0: 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61  UTF-8 implementa
78b0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
78c0: 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74  int nocaseCollat
78d0: 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20  ingFunc(.  void 
78e0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20  *NotUsed,.  int 
78f0: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
7900: 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
7910: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
7920: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
7930: 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t r = sqlite3Str
7940: 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f  NICmp(.      (co
7950: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31  nst char *)pKey1
7960: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
7970: 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b  pKey2, (nKey1<nK
7980: 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32  ey2)?nKey1:nKey2
7990: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
79a0: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
79b0: 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20    if( 0==r ){.  
79c0: 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79    r = nKey1-nKey
79d0: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
79e0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
79f0: 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  rn the ROWID of 
7a00: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
7a10: 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65  insert.*/.sqlite
7a20: 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c  _int64 sqlite3_l
7a30: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
7a40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
7a50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7a60: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
7a70: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
7a80: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
7a90: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
7aa0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
7ab0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7ac0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
7ad0: 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a   db->lastRowid;.
7ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
7af0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
7b00: 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  by the sqlite3_l
7b10: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
7b20: 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  () API function.
7b30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7b40: 5f 73 65 74 5f 6c 61 73 74 5f 69 6e 73 65 72 74  _set_last_insert
7b50: 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  _rowid(sqlite3 *
7b60: 64 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  db, sqlite3_int6
7b70: 34 20 69 52 6f 77 69 64 29 7b 0a 23 69 66 64 65  4 iRowid){.#ifde
7b80: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7b90: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7ba0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7bb0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
7bc0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
7bd0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
7be0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
7bf0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
7c00: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
7c10: 78 29 3b 0a 20 20 64 62 2d 3e 6c 61 73 74 52 6f  x);.  db->lastRo
7c20: 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
7c30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7c40: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7c50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7c60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
7c70: 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73  anges in the mos
7c80: 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f  t recent call to
7c90: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
7ca0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7cb0: 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  changes(sqlite3 
7cc0: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
7cd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
7ce0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
7cf0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
7d00: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
7d10: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
7d20: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
7d30: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
7d40: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
7d50: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
7d60: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
7d70: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
7d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
7d90: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
7da0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7db0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
7dc0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
7dd0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
7de0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
7df0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
7e00: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
7e10: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
7e20: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
7e30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
7e40: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
7e50: 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a  ->nTotalChange;.
7e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
7e70: 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
7e80: 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
7e90: 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74  n only manipulat
7ea0: 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  es fields of the
7eb0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
7ec0: 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64  dle object, it d
7ed0: 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e  oes not close an
7ee0: 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
7ef0: 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a  t may be open.**
7f00: 20 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70   at the b-tree/p
7f10: 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76  ager level..*/.v
7f20: 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  oid sqlite3Close
7f30: 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74  Savepoints(sqlit
7f40: 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65  e3 *db){.  while
7f50: 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  ( db->pSavepoint
7f60: 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e   ){.    Savepoin
7f70: 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53  t *pTmp = db->pS
7f80: 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62  avepoint;.    db
7f90: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
7fa0: 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Tmp->pNext;.    
7fb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7fc0: 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64  , pTmp);.  }.  d
7fd0: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->nSavepoint = 
7fe0: 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0;.  db->nStatem
7ff0: 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69  ent = 0;.  db->i
8000: 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
8010: 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  point = 0;.}../*
8020: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64  .** Invoke the d
8030: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
8040: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
8050: 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66  th FuncDef p, if
8060: 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a   any. Except,.**
8070: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
8080: 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66  the last copy of
8090: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64   the function, d
80a0: 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e  o not invoke it.
80b0: 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70   Multiple.** cop
80c0: 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ies of a single 
80d0: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65  function are cre
80e0: 61 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65  ated when create
80f0: 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63  _function() is c
8100: 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51  alled.** with SQ
8110: 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20  LITE_ANY as the 
8120: 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61  encoding..*/.sta
8130: 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f  tic void functio
8140: 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33  nDestroy(sqlite3
8150: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
8160: 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  ){.  FuncDestruc
8170: 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72  tor *pDestructor
8180: 20 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72 75 63   = p->u.pDestruc
8190: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
81a0: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
81b0: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
81c0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
81d0: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
81e0: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
81f0: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
8200: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
8210: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
8220: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8230: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
8240: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8250: 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20   Disconnect all 
8260: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a  sqlite3_vtab obj
8270: 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ects that belong
8280: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e   to database con
8290: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54  nection.** db. T
82a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
82b0: 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67 20 63  en db is being c
82c0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
82d0: 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74   void disconnect
82e0: 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20  AllVtab(sqlite3 
82f0: 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  *db){.#ifndef SQ
8300: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8310: 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a  LTABLE.  int i;.
8320: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
8330: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
8340: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
8350: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
8360: 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d   i++){.    Schem
8370: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
8380: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[i].pSchema;
8390: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
83a0: 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [i].pSchema ){. 
83b0: 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74       for(p=sqlit
83c0: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
83d0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70  ema->tblHash); p
83e0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
83f0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(p)){.        
8400: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
8410: 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  able *)sqliteHas
8420: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
8430: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
8440: 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56  pTab) ) sqlite3V
8450: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
8460: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  , pTab);.      }
8470: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8480: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
8490: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
84a0: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
84b0: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d  hNext(p)){.    M
84c0: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
84d0: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
84e0: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69  shData(p);.    i
84f0: 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  f( pMod->pEpoTab
8500: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8510: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
8520: 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  db, pMod->pEpoTa
8530: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
8540: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
8550: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
8560: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
8570: 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55  l(db);.#else.  U
8580: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
8590: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  db);.#endif.}../
85a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
85b0: 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   if database con
85c0: 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75  nection db has u
85d0: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
85e0: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
85f0: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
8600: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
8610: 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61  bjects.  .*/.sta
8620: 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69  tic int connecti
8630: 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33  onIsBusy(sqlite3
8640: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *db){.  int j;.
8650: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8660: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8670: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
8680: 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74   db->pVdbe ) ret
8690: 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30  urn 1;.  for(j=0
86a0: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
86b0: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
86c0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  t = db->aDb[j].p
86d0: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
86e0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
86f0: 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29  sInBackup(pBt) )
8700: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
8710: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8720: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
8730: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
8740: 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  abase.*/.static 
8750: 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  int sqlite3Close
8760: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
8770: 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a  t forceZombie){.
8780: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
8790: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
87a0: 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43   R-63257-11740 C
87b0: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63  alling sqlite3_c
87c0: 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a  lose() or.    **
87d0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
87e0: 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  2() with a NULL 
87f0: 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74  pointer argument
8800: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
8810: 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74  o-op. */.    ret
8820: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8830: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
8840: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
8850: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
8860: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
8870: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
8880: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8890: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
88a0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54 72 61 63  .  if( db->mTrac
88b0: 65 20 26 20 53 51 4c 49 54 45 5f 54 52 41 43 45  e & SQLITE_TRACE
88c0: 5f 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 64 62  _CLOSE ){.    db
88d0: 2d 3e 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f  ->xTrace(SQLITE_
88e0: 54 52 41 43 45 5f 43 4c 4f 53 45 2c 20 64 62 2d  TRACE_CLOSE, db-
88f0: 3e 70 54 72 61 63 65 41 72 67 2c 20 64 62 2c 20  >pTraceArg, db, 
8900: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  0);.  }..  /* Fo
8910: 72 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  rce xDisconnect 
8920: 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72  calls on all vir
8930: 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tual tables */. 
8940: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
8950: 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ab(db);..  /* If
8960: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
8970: 73 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63  s open, the disc
8980: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20  onnectAllVtab() 
8990: 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20  call above.  ** 
89a0: 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61  will not have ca
89b0: 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e  lled the xDiscon
89c0: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e  nect() method on
89d0: 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a   any virtual.  *
89e0: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
89f0: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
8a00: 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ray. The followi
8a10: 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  ng sqlite3VtabRo
8a20: 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61  llback().  ** ca
8a30: 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57  ll will do so. W
8a40: 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69  e need to do thi
8a50: 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65  s before the che
8a60: 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20  ck for active.  
8a70: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
8a80: 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20  s below, as the 
8a90: 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  v-table implemen
8aa0: 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74  tation may be st
8ab0: 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20  oring.  ** some 
8ac0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8ad0: 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  nts internally..
8ae0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74    */.  sqlite3Vt
8af0: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
8b00: 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68  .  /* Legacy beh
8b10: 61 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63  avior (sqlite3_c
8b20: 6c 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29  lose() behavior)
8b30: 20 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20   is to return.  
8b40: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
8b50: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
8b60: 20 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73   can not be clos
8b70: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
8b80: 20 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63    */.  if( !forc
8b90: 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65  eZombie && conne
8ba0: 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20  ctionIsBusy(db) 
8bb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8bc0: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
8bd0: 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61  QLITE_BUSY, "una
8be0: 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65  ble to close due
8bf0: 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20   to unfinalized 
8c00: 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d  ".       "statem
8c10: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
8c20: 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20  ed backups");.  
8c30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8c40: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8c50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8c60: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23  ITE_BUSY;.  }..#
8c70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8c80: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28  BLE_SQLLOG.  if(
8c90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
8ca0: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a  nfig.xSqllog ){.
8cb0: 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74      /* Closing t
8cc0: 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74  he handle. Fourt
8cd0: 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  h parameter is p
8ce0: 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20  assed the value 
8cf0: 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  2. */.    sqlite
8d00: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
8d10: 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f  qllog(sqlite3Glo
8d20: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
8d30: 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b  gArg, db, 0, 2);
8d40: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
8d50: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f  * Convert the co
8d60: 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20  nnection into a 
8d70: 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20  zombie and then 
8d80: 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  close it..  */. 
8d90: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
8da0: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
8db0: 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65  ;.  sqlite3Leave
8dc0: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
8dd0: 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  bie(db);.  retur
8de0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8df0: 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74  /*.** Two variat
8e00: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c  ions on the publ
8e10: 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72  ic interface for
8e20: 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62   closing a datab
8e30: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
8e40: 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  n. The sqlite3_c
8e50: 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72  lose() version r
8e60: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
8e70: 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73  SY and.** leaves
8e80: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8e90: 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  option if there 
8ea0: 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  are unfinalized 
8eb0: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
8ec0: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
8ed0: 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63  shed sqlite3_bac
8ee0: 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74  kups.  The sqlit
8ef0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a  e3_close_v2().**
8f00: 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20   version forces 
8f10: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
8f20: 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69  o become a zombi
8f30: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  e if there are.*
8f40: 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75  * unclosed resou
8f50: 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67  rces, and arrang
8f60: 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74  es for deallocat
8f70: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ion when the las
8f80: 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61  t.** prepare sta
8f90: 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65  tement or sqlite
8fa0: 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e  3_backup closes.
8fb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8fc0: 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  close(sqlite3 *d
8fd0: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
8fe0: 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d  e3Close(db,0); }
8ff0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
9000: 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64  se_v2(sqlite3 *d
9010: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
9020: 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d  e3Close(db,1); }
9030: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  .../*.** Close t
9040: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
9050: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9060: 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65  db..**.** Furthe
9070: 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61  rmore, if databa
9080: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
9090: 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65   is a zombie (me
90a0: 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65  aning that there
90b0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70  .** has been a p
90c0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
90d0: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f  ite3_close(db) o
90e0: 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  r sqlite3_close_
90f0: 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65  v2(db)) and.** e
9100: 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d  very sqlite3_stm
9110: 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66  t has now been f
9120: 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65  inalized and eve
9130: 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ry sqlite3_backu
9140: 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65  p has.** finishe
9150: 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c  d, then free all
9160: 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76   resources..*/.v
9170: 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65  oid sqlite3Leave
9180: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
9190: 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  bie(sqlite3 *db)
91a0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
91d0: 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  e iterator */.  
91e0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20  int j;..  /* If 
91f0: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
9200: 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74  nding sqlite3_st
9210: 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  mt or sqlite3_ba
9220: 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a  ckup objects.  *
9230: 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e  * or if the conn
9240: 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  ection has not y
9250: 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62  et been closed b
9260: 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  y sqlite3_close_
9270: 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  v2(),.  ** then 
9280: 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d  just leave the m
9290: 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e  utex and return.
92a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
92b0: 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
92c0: 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f  GIC_ZOMBIE || co
92d0: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64  nnectionIsBusy(d
92e0: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
92f0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
9300: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
9310: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
9320: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
9330: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
9340: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
9350: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
9360: 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c  s.  ** closed al
9370: 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61  l sqlite3_stmt a
9380: 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  nd sqlite3_backu
9390: 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61  p objects and ha
93a0: 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73  s been.  ** pass
93b0: 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ed to sqlite3_cl
93c0: 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ose (meaning tha
93d0: 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65  t it is a zombie
93e0: 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20  ).  Therefore,. 
93f0: 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64   ** go ahead and
9400: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
9410: 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ces..  */..  /* 
9420: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
9430: 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69   is open, roll i
9440: 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73  t back. This als
9450: 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69  o ensures that i
9460: 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62  f.  ** any datab
9470: 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65  ase schemas have
9480: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62   been modified b
9490: 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64  y an uncommitted
94a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
94b0: 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74  * they are reset
94c0: 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72  . And that the r
94d0: 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d  equired b-tree m
94e0: 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20  utex is held to 
94f0: 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  make.  ** the pa
9500: 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ger rollback and
9510: 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e   schema reset an
9520: 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f   atomic operatio
9530: 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52  n. */.  sqlite3R
9540: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
9550: 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a  QLITE_OK);..  /*
9560: 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61   Free any outsta
9570: 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20  nding Savepoint 
9580: 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20  structures. */. 
9590: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
95a0: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20  epoints(db);..  
95b0: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74  /* Close all dat
95c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
95d0: 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  s */.  for(j=0; 
95e0: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
95f0: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
9600: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a  pDb = &db->aDb[j
9610: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
9620: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
9630: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
9640: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
9650: 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20  pDb->pBt = 0;.  
9660: 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a      if( j!=1 ){.
9670: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63          pDb->pSc
9680: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
9690: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
96a0: 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20   Clear the TEMP 
96b0: 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c  schema separatel
96c0: 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20  y and last */.  
96d0: 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
96e0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71  Schema ){.    sq
96f0: 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72  lite3SchemaClear
9700: 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  (db->aDb[1].pSch
9710: 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ema);.  }.  sqli
9720: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
9730: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  t(db);..  /* Fre
9740: 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f  e up the array o
9750: 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  f auxiliary data
9760: 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  bases */.  sqlit
9770: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
9780: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61  seArray(db);.  a
9790: 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d  ssert( db->nDb<=
97a0: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  2 );.  assert( d
97b0: 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53  b->aDb==db->aDbS
97c0: 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54  tatic );..  /* T
97d0: 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ell the code in 
97e0: 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68  notify.c that th
97f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20  e connection no 
9800: 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79  longer holds any
9810: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20  .  ** locks and 
9820: 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
9830: 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c   any further unl
9840: 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
9850: 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  acks..  */.  sql
9860: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c  ite3ConnectionCl
9870: 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72  osed(db);..  for
9880: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
9890: 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20  st(&db->aFunc); 
98a0: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
98b0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 46 75 6e  ext(i)){.    Fun
98c0: 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 3b  cDef *pNext, *p;
98d0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48  .    p = sqliteH
98e0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
98f0: 64 6f 7b 0a 20 20 20 20 20 20 66 75 6e 63 74 69  do{.      functi
9900: 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29  onDestroy(db, p)
9910: 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
9920: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
9930: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9940: 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20  , p);.      p = 
9950: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 77 68 69 6c  pNext;.    }whil
9960: 65 28 20 70 20 29 3b 0a 20 20 7d 0a 20 20 73 71  e( p );.  }.  sq
9970: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
9980: 64 62 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 66 6f  db->aFunc);.  fo
9990: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
99a0: 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  rst(&db->aCollSe
99b0: 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  q); i; i=sqliteH
99c0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
99d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
99e0: 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c  = (CollSeq *)sql
99f0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9a00: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e      /* Invoke an
9a10: 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65  y destructors re
9a20: 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c  gistered for col
9a30: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9a40: 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20  user data. */.  
9a50: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
9a60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
9a70: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b  pColl[j].xDel ){
9a80: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a  .        pColl[j
9a90: 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e  ].xDel(pColl[j].
9aa0: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pUser);.      }.
9ab0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9ac0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
9ad0: 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
9ae0: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
9af0: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
9b00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
9b10: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f  IRTUALTABLE.  fo
9b20: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
9b30: 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  rst(&db->aModule
9b40: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
9b50: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
9b60: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
9b70: 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48  Module *)sqliteH
9b80: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
9b90: 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72  if( pMod->xDestr
9ba0: 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64  oy ){.      pMod
9bb0: 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d  ->xDestroy(pMod-
9bc0: 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20  >pAux);.    }.  
9bd0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f    sqlite3VtabEpo
9be0: 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61 72  nymousTableClear
9bf0: 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20  (db, pMod);.    
9c00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9c10: 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73  , pMod);.  }.  s
9c20: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
9c30: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
9c40: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
9c50: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
9c60: 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63  _OK); /* Dealloc
9c70: 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64 20  ates any cached 
9c80: 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a  error strings. *
9c90: 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  /.  sqlite3Value
9ca0: 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Free(db->pErr);.
9cb0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78    sqlite3CloseEx
9cc0: 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69  tensions(db);.#i
9cd0: 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
9ce0: 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73  THENTICATION.  s
9cf0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9d00: 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b  auth.zAuthUser);
9d10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9d20: 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57  db->auth.zAuthPW
9d30: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d  );.#endif..  db-
9d40: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
9d50: 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20  MAGIC_ERROR;..  
9d60: 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61  /* The temp-data
9d70: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61  base schema is a
9d80: 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65  llocated differe
9d90: 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74  ntly from the ot
9da0: 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20  her schema.  ** 
9db0: 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73  objects (using s
9dc0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69  qliteMalloc() di
9dd0: 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
9de0: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  of sqlite3BtreeS
9df0: 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53  chema())..  ** S
9e00: 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
9e10: 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64   freed here. Tod
9e20: 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20  o: Why not roll 
9e30: 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20  the temp schema 
9e40: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61  into.  ** the sa
9e50: 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  me sqliteMalloc(
9e60: 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61  ) as the one tha
9e70: 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20  t allocates the 
9e80: 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73  database .  ** s
9e90: 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20  tructure?.  */. 
9ea0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9eb0: 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  b, db->aDb[1].pS
9ec0: 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
9ed0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
9ee0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
9ef0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
9f00: 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73  AGIC_CLOSED;.  s
9f10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
9f20: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9f30: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
9f40: 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b  aside.nOut==0 );
9f50: 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20    /* Fails on a 
9f60: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
9f70: 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64   leak */.  if( d
9f80: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
9f90: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
9fa0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
9fb0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
9fc0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
9fd0: 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a  free(db);.}../*.
9fe0: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
9ff0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
a000: 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20   If tripCode is 
a010: 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74  not SQLITE_OK, t
a020: 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65  hen.** any write
a030: 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76   cursors are inv
a040: 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70 70  alidated ("tripp
a050: 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69  ed" - as in "tri
a060: 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a  pping a circuit.
a070: 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64  ** breaker") and
a080: 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20   made to return 
a090: 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65 72  tripCode if ther
a0a0: 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68 65  e are any furthe
a0b0: 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  r.** attempts to
a0c0: 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f 72   use that cursor
a0d0: 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72 73 20  .  Read cursors 
a0e0: 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20  remain open and 
a0f0: 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72 65  valid.** but are
a100: 20 22 73 61 76 65 64 22 20 69 6e 20 63 61 73 65   "saved" in case
a110: 20 74 68 65 20 74 61 62 6c 65 20 70 61 67 65 73   the table pages
a120: 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e   are moved aroun
a130: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
a140: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71  e3RollbackAll(sq
a150: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74  lite3 *db, int t
a160: 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ripCode){.  int 
a170: 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  i;.  int inTrans
a180: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63 68 65   = 0;.  int sche
a190: 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65  maChange;.  asse
a1a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a1b0: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
a1c0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  ) );.  sqlite3Be
a1d0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
a1e0: 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  );..  /* Obtain 
a1f0: 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74 65 78  all b-tree mutex
a200: 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  es before making
a210: 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42 74   any calls to Bt
a220: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a  reeRollback(). .
a230: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6d 70    ** This is imp
a240: 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65 20 74  ortant in case t
a250: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
a260: 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
a270: 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69   has.  ** modifi
a280: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
a290: 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65 20 62  schema. If the b
a2a0: 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 61 72  -tree mutexes ar
a2b0: 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a  e not taken.  **
a2c0: 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74   here, then anot
a2d0: 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
a2e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68   connection migh
a2f0: 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74 77 65  t sneak in betwe
a300: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  en.  ** the data
a310: 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  base rollback an
a320: 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 2c 20  d schema reset, 
a330: 77 68 69 63 68 20 63 61 6e 20 63 61 75 73 65 20  which can cause 
a340: 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75  false.  ** corru
a350: 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e  ption reports in
a360: 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f   some cases.  */
a370: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
a380: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73  nterAll(db);.  s
a390: 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64  chemaChange = (d
a3a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
a3b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
a3c0: 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  !=0 && db->init.
a3d0: 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28  busy==0;..  for(
a3e0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
a3f0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
a400: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
a410: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
a420: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
a430: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
a440: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
a450: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
a460: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a470: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
a480: 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63  p, tripCode, !sc
a490: 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20  hemaChange);.   
a4a0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
a4b0: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
a4c0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
a4d0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
a4e0: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26   if( (db->flags&
a4f0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
a500: 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e  nges)!=0 && db->
a510: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
a520: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
a530: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
a540: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  nts(db);.    sql
a550: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
a560: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
a570: 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
a580: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
a590: 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64  db);..  /* Any d
a5a0: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
a5b0: 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61  nt violations ha
a5c0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f  ve now been reso
a5d0: 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e  lved. */.  db->n
a5e0: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
a5f0: 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  ;.  db->nDeferre
a600: 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
a610: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
a620: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a  LITE_DeferFKs;..
a630: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20    /* If one has 
a640: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
a650: 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c   invoke the roll
a660: 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61  back-hook callba
a670: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ck */.  if( db->
a680: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
a690: 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c  k && (inTrans ||
a6a0: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
a6b0: 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f  ) ){.    db->xRo
a6c0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64  llbackCallback(d
a6d0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29  b->pRollbackArg)
a6e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
a6f0: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
a700: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
a710: 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73   the name corres
a720: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65  ponding to the e
a730: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65  rror code.** spe
a740: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72  cified in the ar
a750: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64  gument..*/.#if d
a760: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45  efined(SQLITE_NE
a770: 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e  ED_ERR_NAME).con
a780: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
a790: 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b  ErrName(int rc){
a7a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a7b0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
a7c0: 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a  i, origRc = rc;.
a7d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26    for(i=0; i<2 &
a7e0: 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c  & zName==0; i++,
a7f0: 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20   rc &= 0xff){.  
a800: 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a    switch( rc ){.
a810: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a820: 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20  E_OK:           
a830: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a840: 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20  QLITE_OK";      
a850: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a860: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a870: 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20  TE_ERROR:       
a880: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a890: 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20  SQLITE_ERROR";  
a8a0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a8b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a8c0: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20  ITE_INTERNAL:   
a8d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a8e0: 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c  "SQLITE_INTERNAL
a8f0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
a900: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a910: 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20  LITE_PERM:      
a920: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a930: 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20   "SQLITE_PERM"; 
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a950: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a960: 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20  QLITE_ABORT:    
a970: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a980: 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22  = "SQLITE_ABORT"
a990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
a9a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a9b0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
a9c0: 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65  LBACK:     zName
a9d0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
a9e0: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62  _ROLLBACK";    b
a9f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aa00: 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20   SQLITE_BUSY:   
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
aa20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
aa30: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
aa40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aa50: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
aa60: 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61  COVERY:      zNa
aa70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
aa80: 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20  Y_RECOVERY";    
aa90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aaa0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53  se SQLITE_BUSY_S
aab0: 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e  NAPSHOT:      zN
aac0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
aad0: 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20  SY_SNAPSHOT";   
aae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aaf0: 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ase SQLITE_LOCKE
ab00: 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  D:             z
ab10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c  Name = "SQLITE_L
ab20: 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20  OCKED";         
ab30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ab40: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
ab50: 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20  ED_SHAREDCACHE: 
ab60: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ab70: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
ab80: 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  HE";break;.     
ab90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d   case SQLITE_NOM
aba0: 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  EM:             
abb0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
abc0: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20  _NOMEM";        
abd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
abe0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
abf0: 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20  ADONLY:         
ac00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac10: 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20  E_READONLY";    
ac20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
ac40: 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59  EADONLY_RECOVERY
ac50: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
ac60: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f  TE_READONLY_RECO
ac70: 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VERY"; break;.  
ac80: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ac90: 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43  READONLY_CANTLOC
aca0: 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  K:  zName = "SQL
acb0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
acc0: 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  TLOCK"; break;. 
acd0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ace0: 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
acf0: 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CK:  zName = "SQ
ad00: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
ad10: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
ad20: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad30: 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
ad40: 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ED:   zName = "S
ad50: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
ad60: 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b  BMOVED";  break;
ad70: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ad80: 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20  TE_INTERRUPT:   
ad90: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ada0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
adb0: 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";         break
adc0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
add0: 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20  ITE_IOERR:      
ade0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
adf0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20  "SQLITE_IOERR"; 
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ae10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae20: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a  LITE_IOERR_READ:
ae30: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ae40: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
ae50: 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65  EAD";        bre
ae60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
ae80: 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20  T_READ:   zName 
ae90: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aea0: 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72  SHORT_READ";  br
aeb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aec0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
aed0: 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  TE:        zName
aee0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
aef0: 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62  _WRITE";       b
af00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
af10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
af20: 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  YNC:        zNam
af30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
af40: 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20  R_FSYNC";       
af50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
af60: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
af70: 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61  IR_FSYNC:    zNa
af80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
af90: 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20  RR_DIR_FSYNC";  
afa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
afb0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
afc0: 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e  TRUNCATE:     zN
afd0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
afe0: 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20  ERR_TRUNCATE";  
aff0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b000: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b010: 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a  _FSTAT:        z
b020: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b030: 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20  OERR_FSTAT";    
b040: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b050: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b060: 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_UNLOCK:       
b070: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b080: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20  IOERR_UNLOCK";  
b090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b0a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b0b0: 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20  RR_RDLOCK:      
b0c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b0d0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20  _IOERR_RDLOCK"; 
b0e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b0f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b100: 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20  ERR_DELETE:     
b110: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b120: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b  E_IOERR_DELETE";
b130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b140: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b150: 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  OERR_NOMEM:     
b160: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b170: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b  TE_IOERR_NOMEM";
b180: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b190: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1a0: 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20  IOERR_ACCESS:   
b1b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b1c0: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
b1d0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b1e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b1f0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
b200: 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  RVEDLOCK:.      
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b230: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b240: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
b250: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
b260: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b270: 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20  RR_LOCK:        
b280: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b290: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20  _IOERR_LOCK";   
b2a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b2b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b2c0: 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20  ERR_CLOSE:      
b2d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b2e0: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20  E_IOERR_CLOSE"; 
b2f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b300: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b310: 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20  OERR_DIR_CLOSE: 
b320: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b330: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
b340: 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  SE";   break;.  
b350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b360: 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20  IOERR_SHMOPEN:  
b370: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b380: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
b390: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
b3a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b3b0: 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20  _IOERR_SHMSIZE: 
b3c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b3d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
b3e0: 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ZE";     break;.
b3f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b400: 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a  E_IOERR_SHMLOCK:
b410: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b420: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
b430: 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  OCK";     break;
b440: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b450: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a  TE_IOERR_SHMMAP:
b460: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b470: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b480: 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b  MAP";      break
b490: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b4a0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20  ITE_IOERR_SEEK: 
b4b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b4c0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  "SQLITE_IOERR_SE
b4d0: 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  EK";        brea
b4e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b4f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
b500: 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d  E_NOENT: zName =
b510: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
b520: 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65  ELETE_NOENT";bre
b530: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b540: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
b550: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
b560: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b570: 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72  MMAP";        br
b580: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b590: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
b5a0: 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65  TEMPPATH:  zName
b5b0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b5c0: 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62  _GETTEMPPATH"; b
b5d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b5e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f   SQLITE_IOERR_CO
b5f0: 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d  NVPATH:     zNam
b600: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b610: 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20  R_CONVPATH";    
b620: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b630: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
b640: 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  :            zNa
b650: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
b660: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20  RUPT";          
b670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b680: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
b690: 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e  T_VTAB:       zN
b6a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b6b0: 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20  RRUPT_VTAB";    
b6c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b6d0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  ase SQLITE_NOTFO
b6e0: 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a  UND:           z
b6f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
b700: 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20  OTFOUND";       
b710: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b720: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c  case SQLITE_FULL
b730: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
b740: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b750: 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20  FULL";          
b760: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b770: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
b780: 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20  TOPEN:          
b790: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b7a0: 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20  _CANTOPEN";     
b7b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b7c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b7d0: 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52  NTOPEN_NOTEMPDIR
b7e0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
b7f0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
b800: 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20  PDIR";break;.   
b810: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b820: 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20  ANTOPEN_ISDIR:  
b830: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b840: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
b850: 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  R";    break;.  
b860: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b870: 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
b880: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
b890: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
b8a0: 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  LPATH"; break;. 
b8b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b8c0: 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
b8d0: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
b8e0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
b8f0: 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  NVPATH"; break;.
b900: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b910: 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20  E_PROTOCOL:     
b920: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b930: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b  QLITE_PROTOCOL";
b940: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b950: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b960: 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20  TE_EMPTY:       
b970: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b980: 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20  SQLITE_EMPTY";  
b990: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b9a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b9b0: 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20  ITE_SCHEMA:     
b9c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b9d0: 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b  "SQLITE_SCHEMA";
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b9f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ba00: 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20  LITE_TOOBIG:    
ba10: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ba20: 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22   "SQLITE_TOOBIG"
ba30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
ba40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ba50: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
ba60: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
ba70: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
ba80: 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72  AINT";        br
ba90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
baa0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bab0: 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65  T_UNIQUE:  zName
bac0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bad0: 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62  RAINT_UNIQUE"; b
bae0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
baf0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
bb00: 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d  NT_TRIGGER: zNam
bb10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
bb20: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b  TRAINT_TRIGGER";
bb30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bb40: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
bb50: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a  INT_FOREIGNKEY:.
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bb90: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
bba0: 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b  GNKEY";   break;
bbb0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bbc0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48  TE_CONSTRAINT_CH
bbd0: 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  ECK:   zName = "
bbe0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bbf0: 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b  T_CHECK";  break
bc00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bc10: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
bc20: 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20  RIMARYKEY:.     
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bc50: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bc60: 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
bc70: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
bc80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bc90: 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c  NSTRAINT_NOTNULL
bca0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
bcb0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
bcc0: 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20  NULL";break;.   
bcd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bce0: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
bcf0: 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  HOOK:.          
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bd20: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bd30: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20  _COMMITHOOK";   
bd40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bd50: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
bd60: 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61  INT_VTAB:    zNa
bd70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
bd80: 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20  STRAINT_VTAB";  
bd90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bda0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
bdb0: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  AINT_FUNCTION:. 
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bde0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bdf0: 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49  ONSTRAINT_FUNCTI
be00: 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ON";     break;.
be10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
be20: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
be30: 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ID:   zName = "S
be40: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
be50: 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b  _ROWID";  break;
be60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be70: 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20  TE_MISMATCH:    
be80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
be90: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22  SQLITE_MISMATCH"
bea0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
beb0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bec0: 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20  ITE_MISUSE:     
bed0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bee0: 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b  "SQLITE_MISUSE";
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bf00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bf10: 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20  LITE_NOLFS:     
bf20: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bf30: 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b   "SQLITE_NOLFS";
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
bf50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bf60: 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20  QLITE_AUTH:     
bf70: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bf80: 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b  = "SQLITE_AUTH";
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
bfa0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bfb0: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20  SQLITE_FORMAT:  
bfc0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bfd0: 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41   = "SQLITE_FORMA
bfe0: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  T";            b
bff0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c000: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20   SQLITE_RANGE:  
c010: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c020: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47  e = "SQLITE_RANG
c030: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  E";             
c040: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c050: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a  e SQLITE_NOTADB:
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c070: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
c080: 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20  ADB";           
c090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c0a0: 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20  se SQLITE_ROW:  
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c0c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f  ame = "SQLITE_RO
c0d0: 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  W";             
c0e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c0f0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
c100: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
c110: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c120: 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20  OTICE";         
c130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c140: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
c150: 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20  CE_RECOVER_WAL: 
c160: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c170: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
c180: 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  AL";break;.     
c190: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
c1a0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
c1b0: 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  BACK:.          
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c1e0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
c1f0: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  OVER_ROLLBACK"; 
c200: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c210: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
c220: 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  :            zNa
c230: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
c240: 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20  NING";          
c250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c260: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
c270: 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e  G_AUTOINDEX:  zN
c280: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
c290: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22  RNING_AUTOINDEX"
c2a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
c2b0: 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a  ase SQLITE_DONE:
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c2d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44  Name = "SQLITE_D
c2e0: 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  ONE";           
c2f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c300: 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d    }.  if( zName=
c310: 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
c320: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
c330: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c340: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
c350: 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45  ), zBuf, "SQLITE
c360: 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f  _UNKNOWN(%d)", o
c370: 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d  rigRc);.    zNam
c380: 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20  e = zBuf;.  }.  
c390: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
c3a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
c3b0: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
c3c0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
c3d0: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
c3e0: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
c3f0: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
c400: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
c410: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
c420: 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74  (int rc){.  stat
c430: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63  ic const char* c
c440: 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a  onst aMsg[] = {.
c450: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b      /* SQLITE_OK
c460: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f            */ "no
c470: 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20  t an error",.   
c480: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   /* SQLITE_ERROR
c490: 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c         */ "SQL l
c4a0: 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69  ogic error or mi
c4b0: 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c  ssing database",
c4c0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
c4d0: 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c  NTERNAL    */ 0,
c4e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
c4f0: 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61  ERM        */ "a
c500: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
c510: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
c520: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20   SQLITE_ABORT   
c530: 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b      */ "callback
c540: 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79   requested query
c550: 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20   abort",.    /* 
c560: 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20  SQLITE_BUSY     
c570: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
c580: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
c590: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  /* SQLITE_LOCKED
c5a0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
c5b0: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
c5c0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c5d0: 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a  TE_NOMEM       *
c5e0: 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  / "out of memory
c5f0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c600: 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20  _READONLY    */ 
c610: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
c620: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
c630: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
c640: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
c650: 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65    */ "interrupte
c660: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c670: 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f  E_IOERR       */
c680: 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   "disk I/O error
c690: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c6a0: 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20  _CORRUPT     */ 
c6b0: 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  "database disk i
c6c0: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
c6d0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c6e0: 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f  E_NOTFOUND    */
c6f0: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74   "unknown operat
c700: 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ion",.    /* SQL
c710: 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  ITE_FULL        
c720: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20  */ "database or 
c730: 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20  disk is full",. 
c740: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e     /* SQLITE_CAN
c750: 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61  TOPEN    */ "una
c760: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
c770: 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20  base file",.    
c780: 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  /* SQLITE_PROTOC
c790: 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e  OL    */ "lockin
c7a0: 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20  g protocol",.   
c7b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59   /* SQLITE_EMPTY
c7c0: 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65         */ "table
c7d0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
c7e0: 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  a",.    /* SQLIT
c7f0: 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f  E_SCHEMA      */
c800: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
c810: 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a  a has changed",.
c820: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f      /* SQLITE_TO
c830: 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74  OBIG      */ "st
c840: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f  ring or blob too
c850: 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51   big",.    /* SQ
c860: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
c870: 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20   */ "constraint 
c880: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  failed",.    /* 
c890: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
c8a0: 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20     */ "datatype 
c8b0: 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f  mismatch",.    /
c8c0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
c8d0: 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79       */ "library
c8e0: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20   routine called 
c8f0: 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22  out of sequence"
c900: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c910: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
c920: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
c930: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
c940: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
c950: 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61  UTH        */ "a
c960: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e  uthorization den
c970: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
c980: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20  ITE_FORMAT      
c990: 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61  */ "auxiliary da
c9a0: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72  tabase format er
c9b0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c9c0: 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20  ITE_RANGE       
c9d0: 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75  */ "bind or colu
c9e0: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
c9f0: 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  range",.    /* S
ca00: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20  QLITE_NOTADB    
ca10: 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e    */ "file is en
ca20: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
ca30: 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20  t a database",. 
ca40: 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
ca50: 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77   *zErr = "unknow
ca60: 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74  n error";.  swit
ca70: 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
ca80: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
ca90: 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20  ROLLBACK: {.    
caa0: 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20    zErr = "abort 
cab0: 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22  due to ROLLBACK"
cac0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
cad0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
cae0: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20  : {.      rc &= 
caf0: 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  0xff;.      if( 
cb00: 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26  ALWAYS(rc>=0) &&
cb10: 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d   rc<ArraySize(aM
cb20: 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21  sg) && aMsg[rc]!
cb30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
cb40: 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20  rr = aMsg[rc];. 
cb50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
cb60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
cb70: 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a  return zErr;.}..
cb80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cb90: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  ne implements a 
cba0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68  busy callback th
cbb0: 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72  at sleeps and tr
cbc0: 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74  ies.** again unt
cbd0: 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c  il a timeout val
cbe0: 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  ue is reached.  
cbf0: 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  The timeout valu
cc00: 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  e is.** an integ
cc10: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  er number of mil
cc20: 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64  liseconds passed
cc30: 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74   in as the first
cc40: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
cc50: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
cc60: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
cc70: 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74  lback(. void *pt
cc80: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
cc90: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
cca0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20  nection */. int 
ccb0: 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20  count           
ccc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ccd0: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
cce0: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29  s been busy */.)
ccf0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
cd00: 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45  WIN || HAVE_USLE
cd10: 45 50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  EP.  static cons
cd20: 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a  t u8 delays[] =.
cd30: 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20       { 1, 2, 5, 
cd40: 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20  10, 15, 20, 25, 
cd50: 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35  25,  25,  50,  5
cd60: 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74  0, 100 };.  stat
cd70: 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61  ic const u8 tota
cd80: 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c  ls[] =.     { 0,
cd90: 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33   1, 3,  8, 18, 3
cda0: 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20  3, 53, 78, 103, 
cdb0: 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b  128, 178, 228 };
cdc0: 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59  .# define NDELAY
cdd0: 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79   ArraySize(delay
cde0: 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s).  sqlite3 *db
cdf0: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
ce00: 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  r;.  int timeout
ce10: 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f   = db->busyTimeo
ce20: 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c  ut;.  int delay,
ce30: 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72   prior;..  asser
ce40: 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20  t( count>=0 );. 
ce50: 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45   if( count < NDE
ce60: 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  LAY ){.    delay
ce70: 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d   = delays[count]
ce80: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
ce90: 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d  tals[count];.  }
cea0: 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20  else{.    delay 
ceb0: 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d  = delays[NDELAY-
cec0: 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  1];.    prior = 
ced0: 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d  totals[NDELAY-1]
cee0: 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d   + delay*(count-
cef0: 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d  (NDELAY-1));.  }
cf00: 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64  .  if( prior + d
cf10: 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29  elay > timeout )
cf20: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69  {.    delay = ti
cf30: 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20  meout - prior;. 
cf40: 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20     if( delay<=0 
cf50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
cf60: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
cf70: 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79  (db->pVfs, delay
cf80: 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  *1000);.  return
cf90: 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69   1;.#else.  sqli
cfa0: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
cfb0: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
cfc0: 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69  timeout = ((sqli
cfd0: 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79  te3 *)ptr)->busy
cfe0: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28  Timeout;.  if( (
cff0: 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20  count+1)*1000 > 
d000: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72  timeout ){.    r
d010: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
d020: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
d030: 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30 29  ->pVfs, 1000000)
d040: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
d050: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ndif.}../*.** In
d060: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62  voke the given b
d070: 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a  usy handler..**.
d080: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d090: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
d0a0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  n operation fail
d0b0: 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a  ed with a lock..
d0c0: 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
d0d0: 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ne returns non-z
d0e0: 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
d0f0: 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69 74   retried.  If it
d100: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74  .** returns 0, t
d110: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f  he operation abo
d120: 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49  rts with an SQLI
d130: 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a  TE_BUSY error..*
d140: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76  /.int sqlite3Inv
d150: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42  okeBusyHandler(B
d160: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a  usyHandler *p){.
d170: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
d180: 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70  NEVER(p==0) || p
d190: 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d  ->xFunc==0 || p-
d1a0: 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72  >nBusy<0 ) retur
d1b0: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78  n 0;.  rc = p->x
d1c0: 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d  Func(p->pArg, p-
d1d0: 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72  >nBusy);.  if( r
d1e0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  c==0 ){.    p->n
d1f0: 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  Busy = -1;.  }el
d200: 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79  se{.    p->nBusy
d210: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
d220: 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   rc; .}../*.** T
d230: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
d240: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
d250: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
d260: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
d270: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
d280: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
d290: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
d2a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
d2b0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
d2c0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
d2d0: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28  .  int (*xBusy)(
d2e0: 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f  void*,int),.  vo
d2f0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64  id *pArg.){.#ifd
d300: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d310: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
d320: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
d330: 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
d340: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
d350: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
d360: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
d370: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
d380: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
d390: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
d3a0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
d3b0: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
d3c0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
d3d0: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
d3e0: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
d3f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
d400: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d410: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d420: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
d430: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d440: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
d450: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
d460: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
d470: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
d480: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
d490: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
d4a0: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
d4b0: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
d4c0: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
d4d0: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
d4e0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
d4f0: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
d500: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
d510: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d520: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
d530: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
d540: 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20  , .  int nOps,. 
d550: 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73   int (*xProgress
d560: 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69  )(void*), .  voi
d570: 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65  d *pArg.){.#ifde
d580: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d590: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
d5a0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
d5b0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
d5c0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
d5d0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
d5e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
d5f0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
d600: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d610: 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30  x);.  if( nOps>0
d620: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f   ){.    db->xPro
d630: 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73  gress = xProgres
d640: 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  s;.    db->nProg
d650: 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67  ressOps = (unsig
d660: 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62  ned)nOps;.    db
d670: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
d680: 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   pArg;.  }else{.
d690: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
d6a0: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  s = 0;.    db->n
d6b0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b  ProgressOps = 0;
d6c0: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
d6d0: 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  ssArg = 0;.  }. 
d6e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d6f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d700: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
d710: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d720: 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c  nstalls a defaul
d730: 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74  t busy handler t
d740: 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68  hat waits for th
d750: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e  e.** specified n
d760: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
d770: 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74  conds before ret
d780: 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74  urning 0..*/.int
d790: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
d7a0: 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64  meout(sqlite3 *d
d7b0: 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64  b, int ms){.#ifd
d7c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d7d0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
d7e0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
d7f0: 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
d800: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
d810: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
d820: 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20   if( ms>0 ){.   
d830: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
d840: 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65  ndler(db, sqlite
d850: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
d860: 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b  ack, (void*)db);
d870: 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d  .    db->busyTim
d880: 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c  eout = ms;.  }el
d890: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
d8a0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
d8b0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
d8c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d8d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61  }../*.** Cause a
d8e0: 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61  ny pending opera
d8f0: 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20  tion to stop at 
d900: 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70  its earliest opp
d910: 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69  ortunity..*/.voi
d920: 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  d sqlite3_interr
d930: 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  upt(sqlite3 *db)
d940: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d950: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
d960: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
d970: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
d980: 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62   && (db==0 || db
d990: 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f  ->magic!=SQLITE_
d9a0: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20 29 7b  MAGIC_ZOMBIE) ){
d9b0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
d9c0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
d9d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
d9e0: 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69  endif.  db->u1.i
d9f0: 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31  sInterrupted = 1
da00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
da10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61   function is exa
da20: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73  ctly the same as
da30: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
da40: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65  function(), exce
da50: 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  pt.** that it is
da60: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20   designed to be 
da70: 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e  called by intern
da80: 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66  al code. The dif
da90: 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68  ference is.** th
daa0: 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  at if a malloc()
dab0: 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65   fails in sqlite
dac0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
dad0: 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  n(), an error co
dae0: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
daf0: 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63  d and the malloc
db00: 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61  Failed flag clea
db10: 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  red. .*/.int sql
db20: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a  ite3CreateFunc(.
db30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
db40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
db50: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
db60: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
db70: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72  c,.  void *pUser
db80: 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78  Data,.  void (*x
db90: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
dba0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
dbb0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
dbc0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
dbd0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
dbe0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
dbf0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
dc00: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
dc10: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e  context*),.  Fun
dc20: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
dc30: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
dc40: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
dc50: 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74  nName;.  int ext
dc60: 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65  raFlags;..  asse
dc70: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
dc80: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
dc90: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
dca0: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
dcb0: 20 20 20 20 20 28 78 53 46 75 6e 63 20 26 26 20       (xSFunc && 
dcc0: 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70  (xFinal || xStep
dcd0: 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78  )) || .      (!x
dce0: 53 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  SFunc && (xFinal
dcf0: 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a   && !xStep)) ||.
dd00: 20 20 20 20 20 20 28 21 78 53 46 75 6e 63 20 26        (!xSFunc &
dd10: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
dd20: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
dd30: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
dd40: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
dd50: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
dd60: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
dd70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
dd80: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
dd90: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
dda0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
ddb0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  PT;.  }..  asser
ddc0: 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  t( SQLITE_FUNC_C
ddd0: 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f  ONSTANT==SQLITE_
dde0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b  DETERMINISTIC );
ddf0: 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20  .  extraFlags = 
de00: 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45  enc &  SQLITE_DE
de10: 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65  TERMINISTIC;.  e
de20: 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55  nc &= (SQLITE_FU
de30: 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54  NC_ENCMASK|SQLIT
de40: 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64  E_ANY);.  .#ifnd
de50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
de60: 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c  TF16.  /* If SQL
de70: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
de80: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
de90: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
dea0: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
deb0: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
dec0: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
ded0: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
dee0: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
def0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
df00: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
df10: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
df20: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20  ternally..  **. 
df30: 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e   ** If SQLITE_AN
df40: 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  Y is specified, 
df50: 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f  add three versio
df60: 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ns of the functi
df70: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68  on.  ** to the h
df80: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
df90: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
dfa0: 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65  E_UTF16 ){.    e
dfb0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
dfc0: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65  6NATIVE;.  }else
dfd0: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
dfe0: 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ANY ){.    int 
dff0: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
e000: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
e010: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
e020: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
e030: 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  TF8|extraFlags,.
e040: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
e050: 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65  ta, xSFunc, xSte
e060: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
e070: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  ructor);.    if(
e080: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e090: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
e0a0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
e0b0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
e0c0: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
e0d0: 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67  TF16LE|extraFlag
e0e0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73  s,.          pUs
e0f0: 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20  erData, xSFunc, 
e100: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
e110: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
e120: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
e130: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e140: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e150: 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c   }.    enc = SQL
e160: 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d  ITE_UTF16BE;.  }
e170: 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53  .#else.  enc = S
e180: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64  QLITE_UTF8;.#end
e190: 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  if.  .  /* Check
e1a0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
e1b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
e1c0: 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20  g overridden or 
e1d0: 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a  deleted. If so,.
e1e0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
e1f0: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74  re active VMs, t
e200: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
e210: 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e  E_BUSY. If a fun
e220: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65  ction.  ** is be
e230: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64  ing overridden/d
e240: 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65  eleted but there
e250: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
e260: 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20  Ms, allow the.  
e270: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
e280: 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76  continue but inv
e290: 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63  alidate all prec
e2a0: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
e2b0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  ts..  */.  p = s
e2c0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
e2d0: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
e2e0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
e2f0: 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  enc, 0);.  if( p
e300: 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67   && (p->funcFlag
e310: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
e320: 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26  ENCMASK)==enc &&
e330: 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29   p->nArg==nArg )
e340: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56  {.    if( db->nV
e350: 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20  dbeActive ){.   
e360: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
e370: 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
e380: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
e390: 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
e3a0: 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66  te/modify user-f
e3b0: 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61  unction due to a
e3c0: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
e3d0: 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ");.      assert
e3e0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
e3f0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
e400: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
e410: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e420: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
e430: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
e440: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  s(db);.    }.  }
e450: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
e460: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
e470: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
e480: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29  Arg, (u8)enc, 1)
e490: 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20  ;.  assert(p || 
e4a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e4b0: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
e4c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e4d0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
e4e0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64  ..  /* If an old
e4f0: 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  er version of th
e500: 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  e function with 
e510: 61 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73  a configured des
e520: 74 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20  tructor is.  ** 
e530: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69  being replaced i
e540: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
e550: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65  ctor function he
e560: 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f  re. */.  functio
e570: 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b  nDestroy(db, p);
e580: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ..  if( pDestruc
e590: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
e5a0: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  ructor->nRef++;.
e5b0: 20 20 7d 0a 20 20 70 2d 3e 75 2e 70 44 65 73 74    }.  p->u.pDest
e5c0: 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75  ructor = pDestru
e5d0: 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46  ctor;.  p->funcF
e5e0: 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46  lags = (p->funcF
e5f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
e600: 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78  NC_ENCMASK) | ex
e610: 74 72 61 46 6c 61 67 73 3b 0a 20 20 74 65 73 74  traFlags;.  test
e620: 63 61 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61  case( p->funcFla
e630: 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45 54 45  gs & SQLITE_DETE
e640: 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 70  RMINISTIC );.  p
e650: 2d 3e 78 53 46 75 6e 63 20 3d 20 78 53 46 75 6e  ->xSFunc = xSFun
e660: 63 20 3f 20 78 53 46 75 6e 63 20 3a 20 78 53 74  c ? xSFunc : xSt
e670: 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69  ep;.  p->xFinali
e680: 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70  ze = xFinal;.  p
e690: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55  ->pUserData = pU
e6a0: 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41  serData;.  p->nA
e6b0: 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a  rg = (u16)nArg;.
e6c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e6d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
e6e0: 61 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e  ate new user fun
e6f0: 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ctions..*/.int s
e700: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e710: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
e720: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
e730: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
e740: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
e750: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
e760: 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73  void (*xSFunc)(s
e770: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e780: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e790: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
e7a0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
e7b0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
e7c0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
e7d0: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
e7e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e7f0: 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ).){.  return sq
e800: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e810: 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75  ction_v2(db, zFu
e820: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
e830: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
e840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b       xFinal, 0);
e870: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
e880: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
e890: 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
e8a0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e8b0: 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41  *zFunc,.  int nA
e8c0: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
e8d0: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
e8e0: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
e8f0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
e900: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
e910: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
e920: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
e930: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e940: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
e950: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
e960: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
e970: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79   void (*xDestroy
e980: 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69  )(void *).){.  i
e990: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
e9a0: 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74  RROR;.  FuncDest
e9b0: 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30  ructor *pArg = 0
e9c0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e9d0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e9e0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
e9f0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
ea00: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
ea10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
ea20: 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
ea30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ea40: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
ea50: 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20  .  if( xDestroy 
ea60: 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46  ){.    pArg = (F
ea70: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29  uncDestructor *)
ea80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
ea90: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46  ero(db, sizeof(F
eaa0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b  uncDestructor));
eab0: 0a 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29  .    if( !pArg )
eac0: 7b 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79  {.      xDestroy
ead0: 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  (p);.      goto 
eae0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
eaf0: 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20  Arg->xDestroy = 
eb00: 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41  xDestroy;.    pA
eb10: 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20  rg->pUserData = 
eb20: 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  p;.  }.  rc = sq
eb30: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
eb40: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
eb50: 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c   enc, p, xSFunc,
eb60: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
eb70: 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72  pArg);.  if( pAr
eb80: 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d  g && pArg->nRef=
eb90: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
eba0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ebb0: 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28  );.    xDestroy(
ebc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
ebd0: 62 46 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b  bFree(db, pArg);
ebe0: 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63  .  }.. out:.  rc
ebf0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
ec00: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
ec10: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ec20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ec30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
ec40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ec50: 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74  _UTF16.int sqlit
ec60: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
ec70: 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  on16(.  sqlite3 
ec80: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db,.  const voi
ec90: 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  d *zFunctionName
eca0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
ecb0: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
ecc0: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
ecd0: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
ece0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
ecf0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
ed00: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
ed10: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ed20: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
ed30: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
ed40: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
ed50: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
ed60: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
ed70: 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20  zFunc8;..#ifdef 
ed80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
ed90: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
eda0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
edb0: 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63  kOk(db) || zFunc
edc0: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65  tionName==0 ) re
edd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
ede0: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
edf0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ee00: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
ee10: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
ee20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
ee30: 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69  .  zFunc8 = sqli
ee40: 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
ee50: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d  zFunctionName, -
ee60: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
ee70: 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73  ATIVE);.  rc = s
ee80: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
ee90: 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72  (db, zFunc8, nAr
eea0: 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20  g, eTextRep, p, 
eeb0: 78 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69  xSFunc,xStep,xFi
eec0: 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65  nal,0);.  sqlite
eed0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e  3DbFree(db, zFun
eee0: 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  c8);.  rc = sqli
eef0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
ef00: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
ef10: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
ef20: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
ef30: 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  c;.}.#endif.../*
ef40: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74  .** Declare that
ef50: 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20   a function has 
ef60: 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  been overloaded 
ef70: 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  by a virtual tab
ef80: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
ef90: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64   function alread
efa0: 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65  y exists as a re
efb0: 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e  gular global fun
efc0: 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74  ction, then.** t
efd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
efe0: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20   no-op.  If the 
eff0: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
f000: 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72  t exist, then cr
f010: 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  eate.** a new on
f020: 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68  e that always th
f030: 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  rows a run-time 
f040: 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  error.  .**.** W
f050: 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c  hen virtual tabl
f060: 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f  es intend to pro
f070: 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64  vide an overload
f080: 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ed function, the
f090: 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c  y.** should call
f0a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
f0b0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67   make sure the g
f0c0: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65  lobal function e
f0d0: 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62  xists..** A glob
f0e0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  al function must
f0f0: 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20   exist in order 
f100: 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  for name resolut
f110: 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70  ion to work.** p
f120: 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  roperly..*/.int 
f130: 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64  sqlite3_overload
f140: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
f150: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
f160: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
f170: 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69   int nArg.){.  i
f180: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f190: 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  K;..#ifdef SQLIT
f1a0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f1b0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f1c0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f1d0: 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c  b) || zName==0 |
f1e0: 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20  | nArg<-2 ){.   
f1f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
f200: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
f210: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f220: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f230: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  >mutex);.  if( s
f240: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
f250: 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  on(db, zName, nA
f260: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
f270: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   0)==0 ){.    rc
f280: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
f290: 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  Func(db, zName, 
f2a0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
f2b0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
f2d0: 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46   sqlite3InvalidF
f2e0: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  unction, 0, 0, 0
f2f0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
f300: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
f310: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
f320: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f330: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f340: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
f350: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
f360: 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  E./*.** Register
f370: 20 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f   a trace functio
f380: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
f390: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
f3a0: 20 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63   registered trac
f3b0: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
f3c0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
f3d0: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20   trace function 
f3e0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72  means that no tr
f3f0: 61 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  acing is execute
f400: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
f410: 2a 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69  * trace is a poi
f420: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
f430: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
f440: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
f450: 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73  of each.** SQL s
f460: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  tatement..*/.#if
f470: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f480: 5f 44 45 50 52 45 43 41 54 45 44 0a 76 6f 69 64  _DEPRECATED.void
f490: 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28   *sqlite3_trace(
f4a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
f4b0: 64 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a  d(*xTrace)(void*
f4c0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76  ,const char*), v
f4d0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f  oid *pArg){.  vo
f4e0: 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
f4f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f500: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f510: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f520: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f530: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
f540: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
f550: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
f560: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f570: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f580: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
f590: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
f5a0: 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 78 54 72  db->mTrace = xTr
f5b0: 61 63 65 20 3f 20 53 51 4c 49 54 45 5f 54 52 41  ace ? SQLITE_TRA
f5c0: 43 45 5f 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20  CE_LEGACY : 0;. 
f5d0: 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 28 69   db->xTrace = (i
f5e0: 6e 74 28 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c  nt(*)(u32,void*,
f5f0: 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 29 78 54 72  void*,void*))xTr
f600: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
f610: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
f620: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f630: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f640: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
f650: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f660: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
f670: 20 2a 2f 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72   */../* Register
f680: 20 61 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63   a trace callbac
f690: 6b 20 75 73 69 6e 67 20 74 68 65 20 76 65 72 73  k using the vers
f6a0: 69 6f 6e 2d 32 20 69 6e 74 65 72 66 61 63 65 2e  ion-2 interface.
f6b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
f6c0: 74 72 61 63 65 5f 76 32 28 0a 20 20 73 71 6c 69  trace_v2(.  sqli
f6d0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 61 63 65 20         /* Trace 
f700: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
f710: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54  */.  unsigned mT
f720: 72 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  race,           
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74  /* Mask of event
f750: 73 20 74 6f 20 62 65 20 74 72 61 63 65 64 20 2a  s to be traced *
f760: 2f 0a 20 20 69 6e 74 28 2a 78 54 72 61 63 65 29  /.  int(*xTrace)
f770: 28 75 6e 73 69 67 6e 65 64 2c 76 6f 69 64 2a 2c  (unsigned,void*,
f780: 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f  void*,void*),  /
f790: 2a 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e  * Callback to in
f7a0: 76 6f 6b 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  voke */.  void *
f7b0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
f7e0: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
f7f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f800: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f810: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f820: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
f830: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
f840: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
f850: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f860: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f870: 78 29 3b 0a 20 20 69 66 28 20 6d 54 72 61 63 65  x);.  if( mTrace
f880: 3d 3d 30 20 29 20 78 54 72 61 63 65 20 3d 20 30  ==0 ) xTrace = 0
f890: 3b 0a 20 20 69 66 28 20 78 54 72 61 63 65 3d 3d  ;.  if( xTrace==
f8a0: 30 20 29 20 6d 54 72 61 63 65 20 3d 20 30 3b 0a  0 ) mTrace = 0;.
f8b0: 20 20 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 6d    db->mTrace = m
f8c0: 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 78 54 72  Trace;.  db->xTr
f8d0: 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20  ace = xTrace;.  
f8e0: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20  db->pTraceArg = 
f8f0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
f900: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f910: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f920: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
f930: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f940: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
f950: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
f960: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
f970: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
f980: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
f990: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
f9a0: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
f9b0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
f9c0: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
f9d0: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
f9e0: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
f9f0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
fa00: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
fa10: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
fa20: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
fa30: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
fa40: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
fa50: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
fa60: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
fa70: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
fa80: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
fa90: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
faa0: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
fab0: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
fac0: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
fad0: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
fae0: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
faf0: 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
fb00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
fb10: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
fb20: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
fb30: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
fb40: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
fb50: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
fb60: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
fb70: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fb80: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
fb90: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
fba0: 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64  pProfileArg;.  d
fbb0: 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50  b->xProfile = xP
fbc0: 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50  rofile;.  db->pP
fbd0: 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67  rofileArg = pArg
fbe0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
fbf0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
fc00: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
fc10: 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
fc20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
fc30: 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69 66 20  CATED */.#endif 
fc40: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
fc50: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
fc60: 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69  egister a functi
fc70: 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
fc80: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
fc90: 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20  ion commits..** 
fca0: 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66  If the invoked f
fcb0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
fcc0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
fcd0: 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65  he commit become
fce0: 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e  s a.** rollback.
fcf0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
fd00: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20  3_commit_hook(. 
fd10: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
fd20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
fd30: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
fd40: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
fd50: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
fd60: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a  ack)(void*),  /*
fd70: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76   Function to inv
fd80: 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d  oke on each comm
fd90: 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  it */.  void *pA
fda0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
fdb0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
fdc0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
fdd0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
fde0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
fdf0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
fe00: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
fe10: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
fe20: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
fe30: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
fe40: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
fe50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
fe60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fe70: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
fe80: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d  pOld = db->pComm
fe90: 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f  itArg;.  db->xCo
fea0: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78  mmitCallback = x
feb0: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
fec0: 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72  pCommitArg = pAr
fed0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
fee0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
fef0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
ff00: 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  ld;.}../*.** Reg
ff10: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
ff20: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
ff30: 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
ff40: 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
ff50: 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
ff60: 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
ff70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ff80: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
ff90: 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  e3_update_hook(.
ffa0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ffc0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
ffd0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
ffe0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
fff0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
10000 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68  ,char const *,ch
10010 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74  ar const *,sqlit
10020 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  e_int64),.  void
10030 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
10040 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
10050 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
10060 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
10070 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  pRet;..#ifdef SQ
10080 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
10090 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
100a0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
100b0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
100c0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
100d0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
100e0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
100f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10100 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10110 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
10120 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
10130 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
10140 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
10150 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d  db->pUpdateArg =
10160 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
10170 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10180 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
10190 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
101a0 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
101b0 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
101c0 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
101d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
101e0 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20  lled.** back by 
101f0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
10200 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
10210 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62  d *sqlite3_rollb
10220 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ack_hook(.  sqli
10230 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
10240 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
10250 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
10260 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
10270 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
10280 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c  (void*), /* Call
10290 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
102a0 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102c0 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
102d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
102e0 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69   void *pRet;..#i
102f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10300 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
10310 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10320 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
10330 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
10340 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
10350 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
10360 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
10370 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
10380 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
10390 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  = db->pRollbackA
103a0 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  rg;.  db->xRollb
103b0 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ackCallback = xC
103c0 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
103d0 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41  RollbackArg = pA
103e0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
103f0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10400 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
10410 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ret;.}..#ifdef S
10420 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
10430 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a  UPDATE_HOOK./*.*
10440 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
10450 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
10460 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
10470 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
10480 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
10490 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
104a0 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
104b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
104c0 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
104d0 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
104e0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
104f0 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
10500 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
10510 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
10520 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20 20  d(*xCallback)(  
10530 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61         /* Callba
10540 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
10550 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33     void*,sqlite3
10560 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
10570 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71  *,char const*,sq
10580 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69  lite3_int64,sqli
10590 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  te3_int64),.  vo
105a0 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
105b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
105c0 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65   callback argume
105d0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  nt */.){.  void 
105e0 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
105f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
10600 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
10610 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  = db->pPreUpdate
10620 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  Arg;.  db->xPreU
10630 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20  pdateCallback = 
10640 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
10650 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 20 3d  >pPreUpdateArg =
10660 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
10670 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10680 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
10690 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n pRet;.}.#endif
106a0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
106b0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
106c0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
106d0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
106e0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  ** The sqlite3_w
106f0 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
10700 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
10710 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
10720 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a  ocheckpoint()..*
10730 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  * Invoke sqlite3
10740 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
10750 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
10760 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
10770 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  og file.** is gr
10780 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74  eater than sqlit
10790 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20  e3.pWalArg cast 
107a0 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74  to an integer (t
107b0 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
107c0 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75  red by.** wal_au
107d0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e  tocheckpoint()).
107e0 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
107f0 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a  WalDefaultHook(.
10800 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44    void *pClientD
10810 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75  ata,     /* Argu
10820 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
10830 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10840 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a   /* Connection *
10850 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10860 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  zDb,       /* Da
10870 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
10880 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20  nFrame          
10890 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41     /* Size of WA
108a0 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46  L */.){.  if( nF
108b0 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52  rame>=SQLITE_PTR
108c0 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44  _TO_INT(pClientD
108d0 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ata) ){.    sqli
108e0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
108f0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
10900 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
10910 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  nt(db, zDb);.   
10920 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
10930 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20  nMalloc();.  }. 
10940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10950 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
10960 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
10970 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  /../*.** Configu
10980 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61  re an sqlite3_wa
10990 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
109a0 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  k to automatical
109b0 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a  ly checkpoint.**
109c0 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65   a database afte
109d0 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
109e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
109f0 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f  ere are nFrame o
10a00 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73  r.** more frames
10a10 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
10a20 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f  . Passing zero o
10a30 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  r a negative val
10a40 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72  ue as the.** nFr
10a50 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69  ame parameter di
10a60 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63  sables automatic
10a70 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74   checkpoints ent
10a80 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  irely..**.** The
10a90 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
10aa0 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
10ab0 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61  ction replaces a
10ac0 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c  ny existing call
10ad0 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72  back.** register
10ae0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
10af0 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b  _wal_hook(). Lik
10b00 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69  ewise, registeri
10b10 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ng a callback.**
10b20 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
10b30 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c  al_hook() disabl
10b40 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  es the automatic
10b50 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68   checkpoint mech
10b60 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75  anism.** configu
10b70 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
10b80 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
10b90 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
10ba0 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
10bb0 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29  *db, int nFrame)
10bc0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
10bd0 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45  OMIT_WAL.  UNUSE
10be0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
10bf0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10c00 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c  TER(nFrame);.#el
10c10 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  se.#ifdef SQLITE
10c20 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10c30 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10c40 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
10c50 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
10c60 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
10c70 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46 72 61  endif.  if( nFra
10c80 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  me>0 ){.    sqli
10c90 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
10ca0 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
10cb0 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49  ltHook, SQLITE_I
10cc0 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65  NT_TO_PTR(nFrame
10cd0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
10ce0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
10cf0 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  k(db, 0, 0);.  }
10d00 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
10d10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10d20 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
10d30 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
10d40 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
10d50 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
10d60 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
10d70 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  o the write-ahea
10d80 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61  d-log by this da
10d90 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10da0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
10db0 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20  te3_wal_hook(.  
10dc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
10df0 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68 61  ok to this db ha
10e00 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  ndle */.  int(*x
10e10 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a  Callback)(void *
10e20 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
10e30 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20  t char*, int),. 
10e40 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
10e70 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 61  nt passed to xCa
10e80 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23  llback() */.){.#
10e90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10ea0 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70  IT_WAL.  void *p
10eb0 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Ret;.#ifdef SQLI
10ec0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10ed0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10ee0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10ef0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
10f00 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
10f10 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
10f20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
10f30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10f40 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10f50 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61    pRet = db->pWa
10f60 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c  lArg;.  db->xWal
10f70 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
10f80 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c  back;.  db->pWal
10f90 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
10fa0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10fb0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
10fc0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c  return pRet;.#el
10fd0 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  se.  return 0;.#
10fe0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
10ff0 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
11000 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73  se zDb..*/.int s
11010 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
11020 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69  point_v2(.  sqli
11030 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
11040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
11050 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
11060 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11070 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
11080 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
11090 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
110a0 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
110b0 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20  int eMode,      
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  /* SQLITE_CHECKP
110e0 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a  OINT_* value */.
110f0 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20    int *pnLog,   
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
11120 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61  f WAL log in fra
11130 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
11140 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20  Ckpt            
11150 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
11160 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
11170 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69   frames checkpoi
11180 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  nted */.){.#ifde
11190 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
111a0 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  L.  return SQLIT
111b0 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  E_OK;.#else.  in
111c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
111e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
111f0 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49    int iDb = SQLI
11200 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b  TE_MAX_ATTACHED;
11210 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62    /* sqlite3.aDb
11220 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74  [] index of db t
11230 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  o checkpoint */.
11240 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11250 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
11260 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
11270 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
11280 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
11290 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
112a0 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  dif..  /* Initia
112b0 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20  lize the output 
112c0 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20  variables to -1 
112d0 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
112e0 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66   occurs. */.  if
112f0 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67  ( pnLog ) *pnLog
11300 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43   = -1;.  if( pnC
11310 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20  kpt ) *pnCkpt = 
11320 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53  -1;..  assert( S
11330 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
11340 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20  _PASSIVE==0 );. 
11350 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
11360 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d  CHECKPOINT_FULL=
11370 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
11380 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
11390 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a  T_RESTART==2 );.
113a0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
113b0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
113c0 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28  CATE==3 );.  if(
113d0 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48   eMode<SQLITE_CH
113e0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
113f0 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45   || eMode>SQLITE
11400 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
11410 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45  CATE ){.    /* E
11420 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33  VIDENCE-OF: R-03
11430 39 39 36 2d 31 32 30 38 38 20 54 68 65 20 4d 20  996-12088 The M 
11440 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62  parameter must b
11450 65 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 70  e a valid checkp
11460 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  oint.    ** mode
11470 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  : */.    return 
11480 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
11490 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
114a0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
114b0 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20  tex);.  if( zDb 
114c0 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20  && zDb[0] ){.   
114d0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
114e0 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
114f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  );.  }.  if( iDb
11500 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
11510 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
11520 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
11530 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
11540 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20  ERROR, "unknown 
11550 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a  database: %s", z
11560 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Db);.  }else{.  
11570 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
11580 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20  r.nBusy = 0;.   
11590 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65   rc = sqlite3Che
115a0 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c  ckpoint(db, iDb,
115b0 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70   eMode, pnLog, p
115c0 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69  nCkpt);.    sqli
115d0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
115e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
115f0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
11600 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  rc);..  /* If th
11610 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
11620 65 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 63 6c  e statements, cl
11630 65 61 72 20 74 68 65 20 69 6e 74 65 72 72 75 70  ear the interrup
11640 74 20 66 6c 61 67 20 61 74 20 74 68 69 73 0a 20  t flag at this. 
11650 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20   ** point.  */. 
11660 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
11670 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64  tive==0 ){.    d
11680 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
11690 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ted = 0;.  }..  
116a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
116b0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
116c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
116d0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
116e0 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
116f0 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73  e zDb. If zDb is
11700 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65   NULL, or if the
11710 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e   buffer zDb poin
11720 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e  ts.** to contain
11730 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  s a zero-length 
11740 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61  string, all atta
11750 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
11760 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  re .** checkpoin
11770 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
11780 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
11790 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
117a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
117b0 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  {.  /* EVIDENCE-
117c0 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35  OF: R-41613-2055
117d0 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61  3 The sqlite3_wa
117e0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58  l_checkpoint(D,X
117f0 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ) is equivalent 
11800 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
11810 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
11820 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45  2(D,X,SQLITE_CHE
11830 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
11840 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72  0,0). */.  retur
11850 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
11860 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a  eckpoint_v2(db,z
11870 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  Db,SQLITE_CHECKP
11880 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30  OINT_PASSIVE,0,0
11890 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
118a0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
118b0 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70  .** Run a checkp
118c0 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65  oint on database
118d0 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20   iDb. This is a 
118e0 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73  no-op if databas
118f0 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20  e iDb is.** not 
11900 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69  currently open i
11910 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  n WAL mode..**.*
11920 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
11930 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68  on is open on th
11940 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
11950 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74   checkpointed, t
11960 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
11970 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
11980 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65  LOCKED and a che
11990 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61  ckpoint is not a
119a0 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a  ttempted. If .**
119b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
119c0 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74   while running t
119d0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61  he checkpoint, a
119e0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
119f0 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
11a00 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45  ned (i.e. SQLITE
11a10 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69  _IOERR). Otherwi
11a20 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
11a30 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f  *.** The mutex o
11a40 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
11a50 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68  e db should be h
11a60 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eld by the calle
11a70 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20  r. The mutex.** 
11a80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11a90 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74  the specific b-t
11aa0 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70  ree being checkp
11ab0 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20  ointed is taken 
11ac0 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  by.** this funct
11ad0 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68  ion while the ch
11ae0 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e  eckpoint is runn
11af0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  ing..**.** If iD
11b00 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49  b is passed SQLI
11b10 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
11b20 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68   then all attach
11b30 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
11b40 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
11b50 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  . If an error is
11b60 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
11b70 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65  is returned imme
11b80 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20  diately -.** no 
11b90 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
11ba0 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  to checkpoint an
11bb0 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61  y remaining data
11bc0 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  bases..**.** Par
11bd0 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20  ameter eMode is 
11be0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48  one of SQLITE_CH
11bf0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
11c00 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52  , FULL or RESTAR
11c10 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
11c20 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  3Checkpoint(sqli
11c30 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
11c40 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74  , int eMode, int
11c50 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e   *pnLog, int *pn
11c60 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Ckpt){.  int rc 
11c70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11c80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
11c90 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
11ca0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11cc0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
11cd0 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64  through attached
11ce0 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42   dbs */.  int bB
11cf0 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  usy = 0;        
11d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11d10 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  e if SQLITE_BUSY
11d20 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e   has been encoun
11d30 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  tered */..  asse
11d40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11d50 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
11d60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
11d70 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d  pnLog || *pnLog=
11d80 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =-1 );.  assert(
11d90 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43   !pnCkpt || *pnC
11da0 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f  kpt==-1 );..  fo
11db0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
11dc0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
11dd0 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  K; i++){.    if(
11de0 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d   i==iDb || iDb==
11df0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
11e00 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  HED ){.      rc 
11e10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68  = sqlite3BtreeCh
11e20 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62  eckpoint(db->aDb
11e30 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20  [i].pBt, eMode, 
11e40 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
11e50 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b        pnLog = 0;
11e60 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20  .      pnCkpt = 
11e70 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  0;.      if( rc=
11e80 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
11e90 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20          bBusy = 
11ea0 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
11eb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
11ec0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
11ed0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
11ee0 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20  TE_OK && bBusy) 
11ef0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
11f00 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
11f10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
11f20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
11f30 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
11f40 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d  true if main-mem
11f50 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ory should be us
11f60 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
11f70 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
11f80 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20  e for transient 
11f90 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20  pager files and 
11fa0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
11fb0 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ls..** The value
11fc0 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64   returned depend
11fd0 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
11fe0 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  f db->temp_store
11ff0 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72   (runtime.** par
12000 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20  ameter) and the 
12010 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c  compile time val
12020 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d  ue of SQLITE_TEM
12030 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20  P_STORE. The.** 
12040 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
12050 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65  describes the re
12060 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
12070 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c  en these two val
12080 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20  ues.** and this 
12090 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
120a0 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   value..**.**   
120b0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
120c0 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73  E     db->temp_s
120d0 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f  tore     Locatio
120e0 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64  n of temporary d
120f0 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d  atabase.**   ---
12100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
12110 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
12120 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
12130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12140 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
12170 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
12180 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
121b0 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
121c0 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
121d0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
121e0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
121f0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
12200 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
12210 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
12220 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
12230 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
12240 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
12250 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
12260 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
12280 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
12290 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
122d0 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20  urn 1).**   2   
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
12300 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
12310 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33  return 1).**   3
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
12340 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
12350 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a    (return 1).*/.
12360 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49  int sqlite3TempI
12370 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71  nMemory(const sq
12380 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20  lite3 *db){.#if 
12390 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
123a0 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20  E==1.  return ( 
123b0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d  db->temp_store==
123c0 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  2 );.#endif.#if 
123d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
123e0 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20  E==2.  return ( 
123f0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d  db->temp_store!=
12400 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1 );.#endif.#if 
12410 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
12420 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41  E==3.  UNUSED_PA
12430 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72  RAMETER(db);.  r
12440 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
12450 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
12460 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54  STORE<1 || SQLIT
12470 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20  E_TEMP_STORE>3. 
12480 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12490 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(db);.  return 
124a0 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
124b0 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
124c0 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
124d0 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
124e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
124f0 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
12500 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
12510 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
12520 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
12530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
12540 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
12550 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
12560 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
12570 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69  M_BKPT);.  }.  i
12580 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
12590 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
125a0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
125b0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
125c0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
125d0 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  T);.  }.  sqlite
125e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
125f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
12600 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12610 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69   ){.    z = sqli
12620 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
12630 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
12640 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63  }else{.    testc
12650 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30  ase( db->pErr==0
12660 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61   );.    z = (cha
12670 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
12680 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b  _text(db->pErr);
12690 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
126a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
126b0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
126c0 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
126d0 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
126e0 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rCode);.    }.  
126f0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
12700 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
12710 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
12720 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12730 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
12740 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36  ** Return UTF-16
12750 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
12760 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
12770 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
12780 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
12790 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  r..*/.const void
127a0 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
127b0 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  16(sqlite3 *db){
127c0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
127d0 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d  u16 outOfMem[] =
127e0 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c   {.    'o', 'u',
127f0 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   't', ' ', 'o', 
12800 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27  'f', ' ', 'm', '
12810 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72  e', 'm', 'o', 'r
12820 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20  ', 'y', 0.  };. 
12830 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
12840 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20  6 misuse[] = {. 
12850 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27     'l', 'i', 'b'
12860 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c  , 'r', 'a', 'r',
12870 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'y', ' ', .    
12880 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27  'r', 'o', 'u', '
12890 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65  t', 'i', 'n', 'e
128a0 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27  ', ' ', .    'c'
128b0 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c  , 'a', 'l', 'l',
128c0 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20   'e', 'd', ' ', 
128d0 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27  .    'o', 'u', '
128e0 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  t', ' ', .    'o
128f0 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'f', ' ', .  
12900 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c    's', 'e', 'q',
12910 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20   'u', 'e', 'n', 
12920 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b  'c', 'e', 0.  };
12930 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ..  const void *
12940 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
12950 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
12960 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d   *)outOfMem;.  }
12970 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
12980 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
12990 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
129a0 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73  turn (void *)mis
129b0 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  use;.  }.  sqlit
129c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
129d0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
129e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
129f0 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f  d ){.    z = (vo
12a00 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
12a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
12a20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
12a30 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
12a40 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
12a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12a60 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64 62  orWithMsg(db, db
12a70 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69 74  ->errCode, sqlit
12a80 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
12a90 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a 20  Code));.      z 
12aa0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
12ab0 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
12ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
12ad0 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
12ae0 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
12af0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
12b00 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
12b10 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
12b20 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
12b30 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
12b40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12b50 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
12b60 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
12b70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
12b80 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
12b90 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
12ba0 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
12bb0 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
12bc0 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
12bd0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
12be0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
12bf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
12c00 74 65 33 4f 6f 6d 43 6c 65 61 72 28 64 62 29 3b  te3OomClear(db);
12c10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
12c20 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
12c30 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
12c40 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
12c50 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
12c60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
12c70 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
12c80 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e  t error code gen
12c90 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c  erated by an SQL
12ca0 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20  ite routine. If 
12cb0 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65  NULL is.** passe
12cc0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
12cd0 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20  on, we assume a 
12ce0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
12cf0 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  during sqlite3_o
12d00 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pen()..*/.int sq
12d10 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71  lite3_errcode(sq
12d20 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
12d30 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33  ( db && !sqlite3
12d40 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
12d50 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
12d60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
12d70 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
12d80 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d  if( !db || db->m
12d90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12da0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12db0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
12dc0 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
12dd0 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d  rCode & db->errM
12de0 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ask;.}.int sqlit
12df0 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
12e00 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
12e10 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
12e20 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
12e30 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
12e40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12e50 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12e60 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
12e70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12e80 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
12e90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
12ea0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
12eb0 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 69  db->errCode;.}.i
12ec0 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 73 74 65  nt sqlite3_syste
12ed0 6d 5f 65 72 72 6e 6f 28 73 71 6c 69 74 65 33 20  m_errno(sqlite3 
12ee0 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
12ef0 62 20 3f 20 64 62 2d 3e 69 53 79 73 45 72 72 6e  b ? db->iSysErrn
12f00 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a  o : 0;.}  ../*.*
12f10 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
12f20 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
12f30 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
12f40 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
12f50 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
12f60 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20    For now, this 
12f70 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65  simply calls the
12f80 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65   internal sqlite
12f90 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e  3ErrStr().** fun
12fa0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
12fb0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
12fc0 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rstr(int rc){.  
12fd0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
12fe0 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  rStr(rc);.}../*.
12ff0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
13000 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
13010 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  on for database 
13020 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20  "db".  The name 
13030 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20  is zName.** and 
13040 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
13050 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  enc..*/.static i
13060 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  nt createCollati
13070 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
13080 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
13090 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e  *zName, .  u8 en
130a0 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  c,.  void* pCtx,
130b0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
130c0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
130d0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
130e0 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
130f0 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
13100 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
13110 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a  ll;.  int enc2;.
13120 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
13130 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13140 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
13150 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
13160 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
13170 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
13180 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
13190 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
131a0 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
131b0 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
131c0 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
131d0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
131e0 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
131f0 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
13200 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
13210 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
13220 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
13230 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
13240 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
13250 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
13260 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
13270 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
13280 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
13290 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
132a0 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
132b0 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
132c0 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
132d0 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
132e0 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
132f0 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
13300 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13310 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
13320 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
13330 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
13340 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
13350 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
13360 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
13370 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
13380 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
13390 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
133a0 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
133b0 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
133c0 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
133d0 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
133e0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
133f0 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
13400 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
13410 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
13420 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
13430 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
13440 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
13450 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
13460 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ive ){.      sql
13470 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
13480 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
13490 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
134a0 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
134b0 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ify collation se
134c0 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63  quence due to ac
134d0 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
134e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
134f0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
13500 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
13510 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
13520 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20  ements(db);..   
13530 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e   /* If collation
13540 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
13550 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65  was created dire
13560 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74  ctly by a call t
13570 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
13580 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
13590 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72  n, and not gener
135a0 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c  ated by synthCol
135b0 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74  lSeq(),.    ** t
135c0 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d  hen any copies m
135d0 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ade by synthColl
135e0 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65  Seq() need to be
135f0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20   invalidated..  
13600 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61    ** Also, colla
13610 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20  tion destructor 
13620 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29  - CollSeq.xDel()
13630 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20   - function may 
13640 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
13650 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f  e called..    */
13660 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c   .    if( (pColl
13670 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f  ->enc & ~SQLITE_
13680 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d  UTF16_ALIGNED)==
13690 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f  enc2 ){.      Co
136a0 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73  llSeq *aColl = s
136b0 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
136c0 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e  db->aCollSeq, zN
136d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ame);.      int 
136e0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
136f0 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
13700 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20       CollSeq *p 
13710 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  = &aColl[j];.   
13720 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d       if( p->enc=
13730 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
13740 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
13750 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
13760 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70      p->xDel(p->p
13770 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  User);.         
13780 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
13790 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  xCmp = 0;.      
137a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
137b0 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d  }.  }..  pColl =
137c0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
137d0 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
137e0 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69  , zName, 1);.  i
137f0 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65  f( pColl==0 ) re
13800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13810 4d 5f 42 4b 50 54 3b 0a 20 20 70 43 6f 6c 6c 2d  M_BKPT;.  pColl-
13820 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65  >xCmp = xCompare
13830 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  ;.  pColl->pUser
13840 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c   = pCtx;.  pColl
13850 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20  ->xDel = xDel;. 
13860 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75   pColl->enc = (u
13870 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26  8)(enc2 | (enc &
13880 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
13890 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74  IGNED));.  sqlit
138a0 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
138b0 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e  TE_OK);.  return
138c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
138d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
138e0 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
138f0 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
13900 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
13910 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
13920 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
13930 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
13940 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
13950 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
13960 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
13970 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
13980 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
13990 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
139a0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
139b0 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
139c0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
139d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
139e0 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
139f0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
13a00 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
13a10 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
13a20 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
13a30 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
13a40 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
13a50 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
13a60 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
13a70 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
13a80 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20  IABLE_NUMBER,   
13a90 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30     /* IMP: R-380
13aa0 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53 51  91-32352 */.  SQ
13ab0 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
13ac0 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
13ad0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13ae0 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  ADS,.};../*.** M
13af0 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72  ake sure the har
13b00 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74  d limits are set
13b10 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76   to reasonable v
13b20 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c  alues.*/.#if SQL
13b30 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31  ITE_MAX_LENGTH<1
13b40 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
13b50 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73  E_MAX_LENGTH mus
13b60 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
13b70 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
13b80 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
13b90 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
13ba0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
13bb0 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
13bc0 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
13bd0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13be0 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54  SQL_LENGTH>SQLIT
13bf0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65  E_MAX_LENGTH.# e
13c00 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13c10 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
13c20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74  not be greater t
13c30 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  han SQLITE_MAX_L
13c40 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66  ENGTH.#endif.#if
13c50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
13c60 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20  OUND_SELECT<2.# 
13c70 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13c80 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13c90 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13ca0 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 2.#endif.#if S
13cb0 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
13cc0 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  P<40.# error SQL
13cd0 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
13ce0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
13cf0 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   40.#endif.#if S
13d00 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
13d10 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49  ON_ARG<0 || SQLI
13d20 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
13d30 41 52 47 3e 31 32 37 0a 23 20 65 72 72 6f 72 20  ARG>127.# error 
13d40 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
13d50 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20  ION_ARG must be 
13d60 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32  between 0 and 12
13d70 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
13d80 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
13d90 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
13da0 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23 20  _ATTACHED>125.# 
13db0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13dc0 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62  _ATTACHED must b
13dd0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
13de0 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  125.#endif.#if S
13df0 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
13e00 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a  ATTERN_LENGTH<1.
13e10 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13e20 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
13e30 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
13e40 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
13e50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13e60 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65  COLUMN>32767.# e
13e70 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13e80 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20  COLUMN must not 
13e90 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e  exceed 32767.#en
13ea0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13eb0 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
13ec0 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
13ed0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
13ee0 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  PTH must be at l
13ef0 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69  east 1.#endif.#i
13f00 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
13f10 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c  KER_THREADS<0 ||
13f20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
13f30 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23 20  ER_THREADS>50.# 
13f40 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13f50 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
13f60 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
13f70 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a  0 and 50.#endif.
13f80 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
13f90 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69  he value of a li
13fa0 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65  mit.  Report the
13fb0 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49   old value..** I
13fc0 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d  f an invalid lim
13fd0 69 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70  it index is supp
13fe0 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e  lied, report -1.
13ff0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
14000 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65  ges but still re
14010 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c  port the old val
14020 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  ue if the.** new
14030 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
14040 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  ve..**.** A new 
14050 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73  lower limit does
14060 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73   not shrink exis
14070 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e  ting constructs.
14080 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72  .** It merely pr
14090 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74  events new const
140a0 72 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65  ructs that excee
140b0 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66  d the limit.** f
140c0 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a  rom forming..*/.
140d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  int sqlite3_limi
140e0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
140f0 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20  nt limitId, int 
14100 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74  newLimit){.  int
14110 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64   oldLimit;..#ifd
14120 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14130 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
14140 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
14150 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
14160 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
14170 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
14180 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23  return -1;.  }.#
14190 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44  endif..  /* EVID
141a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39  ENCE-OF: R-30189
141b0 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20  -54097 For each 
141c0 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53  limit category S
141d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45  QLITE_LIMIT_NAME
141e0 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
141f0 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
14200 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  d set at compile
14210 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65  -time by a C pre
14220 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d  processor.  ** m
14230 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49  acro called SQLI
14240 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68  TE_MAX_NAME. (Th
14250 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74  e "_LIMIT_" in t
14260 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67  he name is chang
14270 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58  ed to.  ** "_MAX
14280 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  _".).  */.  asse
14290 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
142a0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
142b0 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
142c0 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
142d0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
142e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
142f0 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
14300 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29  MAX_SQL_LENGTH )
14310 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
14320 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
14330 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c  MIT_COLUMN]==SQL
14340 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29  ITE_MAX_COLUMN )
14350 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
14360 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
14370 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d  MIT_EXPR_DEPTH]=
14380 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  =SQLITE_MAX_EXPR
14390 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
143a0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
143b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
143c0 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51  OUND_SELECT]==SQ
143d0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
143e0 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73  D_SELECT);.  ass
143f0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14400 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
14410 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  E_OP]==SQLITE_MA
14420 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61  X_VDBE_OP );.  a
14430 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
14440 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46  t[SQLITE_LIMIT_F
14450 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51  UNCTION_ARG]==SQ
14460 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
14470 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72  N_ARG );.  asser
14480 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
14490 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
144a0 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  HED]==SQLITE_MAX
144b0 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61  _ATTACHED );.  a
144c0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
144d0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
144e0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
144f0 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  TH]==.          
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
14530 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
14540 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
14550 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
14560 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
14570 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54  E_NUMBER]==SQLIT
14580 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
14590 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74  UMBER);.  assert
145a0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
145b0 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
145c0 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
145d0 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
145e0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
145f0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
14600 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
14610 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f  HREADS]==SQLITE_
14620 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
14630 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DS );.  assert( 
14640 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
14650 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28 53 51  KER_THREADS==(SQ
14660 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20  LITE_N_LIMIT-1) 
14670 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74  );...  if( limit
14680 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e  Id<0 || limitId>
14690 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20  =SQLITE_N_LIMIT 
146a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ){.    return -1
146b0 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74  ;.  }.  oldLimit
146c0 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69   = db->aLimit[li
146d0 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65  mitId];.  if( ne
146e0 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20  wLimit>=0 ){    
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14700 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32  * IMP: R-52476-2
14710 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20  8732 */.    if( 
14720 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69  newLimit>aHardLi
14730 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a  mit[limitId] ){.
14740 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
14750 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69   aHardLimit[limi
14760 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  tId];  /* IMP: R
14770 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a  -51463-25634 */.
14780 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c      }.    db->aL
14790 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20  imit[limitId] = 
147a0 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  newLimit;.  }.  
147b0 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b  return oldLimit;
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35       /* IMP: R-5
147e0 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a  3341-35419 */.}.
147f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
14800 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
14810 70 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20  parse both URIs 
14820 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  and non-URI file
14830 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20  names passed by 
14840 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41  the.** user to A
14850 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c  PI functions sql
14860 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73  ite3_open() or s
14870 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
14880 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61  , and for databa
14890 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69  se.** URIs speci
148a0 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  fied as part of 
148b0 41 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74  ATTACH statement
148c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  s..**.** The fir
148d0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
148e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
148f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
14900 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a  VFS to use (or.*
14910 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e  * a NULL to sign
14920 69 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20  ify the default 
14930 56 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20  VFS) if the URI 
14940 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
14950 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20   a "vfs=xxx".** 
14960 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
14970 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
14980 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  ment contains th
14990 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52  e URI (or non-UR
149a0 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69  I filename).** i
149b0 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73  tself. When this
149c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
149d0 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20  led the *pFlags 
149e0 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
149f0 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64  contain.** the d
14a00 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20  efault flags to 
14a10 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  open the databas
14a20 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54  e handle with. T
14a30 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
14a40 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61  in.** *pFlags ma
14a50 79 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66  y be updated bef
14a60 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66  ore returning if
14a70 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d   the URI filenam
14a80 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22  e contains .** "
14a90 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d  cache=xxx" or "m
14aa0 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70  ode=xxx" query p
14ab0 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  arameters..**.**
14ac0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
14ad0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
14ae0 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
14af0 61 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65  ase *ppVfs is se
14b00 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
14b10 20 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68   the VFS that sh
14b20 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20  ould be used to 
14b30 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  open the databas
14b40 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20  e file. *pzFile 
14b50 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69  is set to.** poi
14b60 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
14b70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
14b80 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  me of the file t
14b90 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68  o open. It is th
14ba0 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
14bb0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
14bc0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
14bd0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72   call sqlite3_fr
14be0 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a  ee() to release.
14bf0 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a  ** this buffer..
14c00 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
14c10 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61  r occurs, then a
14c20 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
14c30 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
14c40 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a  and *pzErrMsg.**
14c50 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
14c60 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14c70 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45   containing an E
14c80 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
14c90 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
14ca0 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
14cb0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
14cc0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
14cd0 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a  ntually release.
14ce0 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
14cf0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
14d00 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74  3_free()..*/.int
14d10 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
14d20 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
14d30 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20  zDefaultVfs,    
14d40 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
14d50 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78  e if no "vfs=xxx
14d60 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a  " query option *
14d70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
14d80 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20  zUri,           
14d90 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69      /* Nul-termi
14da0 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72  nated URI to par
14db0 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  se */.  unsigned
14dc0 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20   int *pFlags,   
14dd0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
14de0 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58  T: SQLITE_OPEN_X
14df0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71  XX flags */.  sq
14e00 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66  lite3_vfs **ppVf
14e10 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
14e20 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65   OUT: VFS to use
14e30 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a   */ .  char **pz
14e40 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
14e50 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46         /* OUT: F
14e60 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e  ilename componen
14e70 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68  t of URI */.  ch
14e80 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20  ar **pzErrMsg   
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ea0 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73   OUT: Error mess
14eb0 61 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49  age (if rc!=SQLI
14ec0 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69  TE_OK) */.){.  i
14ed0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14ee0 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  K;.  unsigned in
14ef0 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67  t flags = *pFlag
14f00 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s;.  const char 
14f10 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74  *zVfs = zDefault
14f20 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  Vfs;.  char *zFi
14f30 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20  le;.  char c;.  
14f40 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74  int nUri = sqlit
14f50 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29  e3Strlen30(zUri)
14f60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a  ;..  assert( *pz
14f70 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20  ErrMsg==0 );..  
14f80 69 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51  if( ((flags & SQ
14f90 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20  LITE_OPEN_URI)  
14fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d             /* IM
14fb0 50 3a 20 52 2d 34 38 37 32 35 2d 33 32 32 30 36  P: R-48725-32206
14fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
14fd0 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
14fe0 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29  Config.bOpenUri)
14ff0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36 38 39   /* IMP: R-51689
15000 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20 26 26 20  -46548 */.   && 
15010 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d  nUri>=5 && memcm
15020 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c  p(zUri, "file:",
15030 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52   5)==0 /* IMP: R
15040 2d 35 37 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a  -57884-37496 */.
15050 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a    ){.    char *z
15060 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74  Opt;.    int eSt
15070 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
15080 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
15090 20 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73   state when pars
150a0 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69  ing URI */.    i
150b0 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20  nt iIn;         
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
150d0 49 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20  Input character 
150e0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
150f0 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   iOut = 0;      
15100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
15110 74 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  tput character i
15120 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75 36 34 20  ndex */.    u64 
15130 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20  nByte = nUri+2; 
15140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
15150 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61  es of space to a
15160 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20  llocate */..    
15170 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
15180 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
15190 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
151a0 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20  indicate to the 
151b0 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a  VFS xOpen .    *
151c0 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68  * method that th
151d0 65 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61  ere may be extra
151e0 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c   parameters foll
151f0 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e  owing the file-n
15200 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61  ame.  */.    fla
15210 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
15220 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28  N_URI;..    for(
15230 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b  iIn=0; iIn<nUri;
15240 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d   iIn++) nByte +=
15250 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27   (zUri[iIn]=='&'
15260 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73  );.    zFile = s
15270 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
15280 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
15290 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
152a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
152b0 54 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b  T;..    iIn = 5;
152c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41  .#ifdef SQLITE_A
152d0 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f 52 49  LLOW_URI_AUTHORI
152e0 54 59 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  TY.    if( strnc
152f0 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 2f 22  mp(zUri+5, "///"
15300 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
15310 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20   iIn = 7;.      
15320 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
15330 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61 75 73 65   condition cause
15340 73 20 55 52 49 73 20 77 69 74 68 20 66 69 76 65  s URIs with five
15350 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72 61   leading / chara
15360 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 6c  cters.      ** l
15370 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f  ike file://///ho
15380 73 74 2f 70 61 74 68 20 74 6f 20 62 65 20 63 6f  st/path to be co
15390 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 55 4e 43  nverted into UNC
153a0 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74 2f 70 61  s like //host/pa
153b0 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th..      ** The
153c0 20 63 6f 72 72 65 63 74 20 55 52 49 20 66 6f 72   correct URI for
153d0 20 74 68 61 74 20 55 4e 43 20 68 61 73 20 6f 6e   that UNC has on
153e0 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75 72 20 6c  ly two or four l
153f0 65 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74  eading / charact
15400 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ers.      ** fil
15410 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68 20 6f 72  e://host/path or
15420 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73 74 2f 70   file:////host/p
15430 61 74 68 2e 20 20 42 75 74 20 35 20 6c 65 61 64  ath.  But 5 lead
15440 69 6e 67 20 73 6c 61 73 68 65 73 20 69 73 20 61  ing slashes is a
15450 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 6f   .      ** commo
15460 6e 20 65 72 72 6f 72 2c 20 77 65 20 61 72 65 20  n error, we are 
15470 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68 61 6e 64  told, so we hand
15480 6c 65 20 69 74 20 61 73 20 61 20 73 70 65 63 69  le it as a speci
15490 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  al case. */.    
154a0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55    if( strncmp(zU
154b0 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d  ri+7, "///", 3)=
154c0 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20 7d 0a 20  =0 ){ iIn++; }. 
154d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
154e0 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f  ncmp(zUri+5, "//
154f0 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20 31 32 29  localhost/", 12)
15500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  ==0 ){.      iIn
15510 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a 23 65 6c   = 16;.    }.#el
15520 73 65 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  se.    /* Discar
15530 64 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e 64  d the scheme and
15540 20 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d 65   authority segme
15550 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e 20  nts of the URI. 
15560 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69 5b  */.    if( zUri[
15570 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b  5]=='/' && zUri[
15580 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  6]=='/' ){.     
15590 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20   iIn = 7;.      
155a0 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
155b0 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
155c0 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20  /' ) iIn++;.    
155d0 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26 26 20    if( iIn!=7 && 
155e0 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63  (iIn!=16 || memc
155f0 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20  mp("localhost", 
15600 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b  &zUri[7], 9)) ){
15610 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d  .        *pzErrM
15620 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
15630 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 75 72  intf("invalid ur
15640 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a  i authority: %.*
15650 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  s", .           
15660 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d   iIn-7, &zUri[7]
15670 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
15680 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15690 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
156a0 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
156b0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
156c0 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
156d0 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79  filename and any
156e0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
156f0 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65  s into the zFile
15700 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a   buffer. .    **
15710 20 44 65 63 6f 64 65 20 25 48 48 20 65 73 63 61   Decode %HH esca
15720 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74  pe codes along t
15730 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a  he way. .    **.
15740 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74 68      ** Within th
15750 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c  is loop, variabl
15760 65 20 65 53 74 61 74 65 20 6d 61 79 20 62 65 20  e eState may be 
15770 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20 32  set to 0, 1 or 2
15780 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20  , depending.    
15790 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69 6e  ** on the parsin
157a0 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f  g context. As fo
157b0 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  llows:.    **.  
157c0 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69 6e    **   0: Parsin
157d0 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20  g file-name..   
157e0 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e 67   **   1: Parsing
157f0 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66   name section of
15800 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
15810 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
15820 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73 69     **   2: Parsi
15830 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f 6e  ng value section
15840 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
15850 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
15860 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53 74  ..    */.    eSt
15870 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  ate = 0;.    whi
15880 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
15890 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
158a0 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b   ){.      iIn++;
158b0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25  .      if( c=='%
158c0 27 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ' .       && sql
158d0 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72  ite3Isxdigit(zUr
158e0 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20 20  i[iIn]) .       
158f0 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
15900 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20  it(zUri[iIn+1]) 
15910 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
15920 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28 73    int octet = (s
15930 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
15940 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34  Uri[iIn++]) << 4
15950 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65 74  );.        octet
15960 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f   += sqlite3HexTo
15970 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29  Int(zUri[iIn++])
15980 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
15990 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f  t( octet>=0 && o
159a0 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20 20  ctet<256 );.    
159b0 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d 30      if( octet==0
159c0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
159d0 54 45 5f 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30  TE_ENABLE_URI_00
159e0 5f 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20  _ERROR.         
159f0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
15a00 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25  is taken when "%
15a10 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68  00" appears with
15a20 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74  in the URI. In t
15a30 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
15a40 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20   case we ignore 
15a50 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20  all text in the 
15a60 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
15a70 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20   path, name or. 
15a80 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
15a90 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
15aa0 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e  g parsed. So ign
15ab0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
15ac0 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20  character.      
15ad0 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20      ** and skip 
15ae0 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c  to the next "?",
15af0 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20   "=" or "&", as 
15b00 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a  appropriate. */.
15b10 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
15b20 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
15b30 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20  !=0 && c!='#' . 
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
15b50 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21  (eState!=0 || c!
15b60 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='?').          
15b70 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
15b80 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20  1 || (c!='=' && 
15b90 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20  c!='&')).       
15ba0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
15bb0 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a  e!=2 || c!='&').
15bc0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
15bd0 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a           iIn++;.
15be0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15bf0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
15c00 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
15c10 2f 2a 20 49 66 20 45 4e 41 42 4c 45 5f 55 52 49  /* If ENABLE_URI
15c20 5f 30 30 5f 45 52 52 4f 52 20 69 73 20 64 65 66  _00_ERROR is def
15c30 69 6e 65 64 2c 20 22 25 30 30 22 20 69 6e 20 61  ined, "%00" in a
15c40 20 55 52 49 20 69 73 20 61 6e 20 65 72 72 6f 72   URI is an error
15c50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2a  . */.          *
15c60 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
15c70 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 65 78  e3_mprintf("unex
15c80 70 65 63 74 65 64 20 25 25 30 30 20 69 6e 20 75  pected %%00 in u
15c90 72 69 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ri");.          
15ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
15cb0 52 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  R;.          got
15cc0 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
15cd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
15ce0 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63  }.        c = oc
15cf0 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tet;.      }else
15d00 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26   if( eState==1 &
15d10 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d  & (c=='&' || c==
15d20 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '=') ){.        
15d30 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31  if( zFile[iOut-1
15d40 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
15d50 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70    /* An empty op
15d60 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72  tion name. Ignor
15d70 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c  e this option al
15d80 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20  together. */.   
15d90 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55         while( zU
15da0 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
15db0 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72  iIn]!='#' && zUr
15dc0 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20  i[iIn-1]!='&' ) 
15dd0 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
15de0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15df0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
15e00 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20   c=='&' ){.     
15e10 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
15e20 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  +] = '\0';.     
15e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15e40 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a      eState = 2;.
15e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e60 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    c = 0;.      }
15e70 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65  else if( (eState
15e80 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c  ==0 && c=='?') |
15e90 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20  | (eState==2 && 
15ea0 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20  c=='&') ){.     
15eb0 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
15ec0 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20    eState = 1;.  
15ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c      }.      zFil
15ee0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20  e[iOut++] = c;. 
15ef0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74     }.    if( eSt
15f00 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69  ate==1 ) zFile[i
15f10 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
15f20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
15f30 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
15f40 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
15f50 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ';..    /* Check
15f60 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61   if there were a
15f70 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69  ny options speci
15f80 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64  fied that should
15f90 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20   be interpreted 
15fa0 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70  .    ** here. Op
15fb0 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69  tions that are i
15fc0 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20  nterpreted here 
15fd0 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e  include "vfs" an
15fe0 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20  d those that.   
15ff0 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74   ** correspond t
16000 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79  o flags that may
16010 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
16020 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  e sqlite3_open_v
16030 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  2().    ** metho
16040 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d  d. */.    zOpt =
16050 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53   &zFile[sqlite3S
16060 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
16070 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f  ];.    while( zO
16080 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69  pt[0] ){.      i
16090 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65  nt nOpt = sqlite
160a0 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b  3Strlen30(zOpt);
160b0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61  .      char *zVa
160c0 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31  l = &zOpt[nOpt+1
160d0 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61  ];.      int nVa
160e0 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
160f0 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20  n30(zVal);..    
16100 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26    if( nOpt==3 &&
16110 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a   memcmp("vfs", z
16120 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 3)==0 ){.  
16130 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61        zVfs = zVa
16140 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  l;.      }else{.
16150 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f          struct O
16160 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20  penMode {.      
16170 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16180 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  z;.          int
16190 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
161a0 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20   *aMode = 0;.   
161b0 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65       char *zMode
161c0 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Type = 0;.      
161d0 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
161e0 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69          int limi
161f0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  t = 0;..        
16200 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d  if( nOpt==5 && m
16210 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a  emcmp("cache", z
16220 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 5)==0 ){.  
16230 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
16240 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
16250 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  CacheMode[] = {.
16260 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73              { "s
16270 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f  hared",  SQLITE_
16280 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
16290 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
162a0 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c  { "private", SQL
162b0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
162c0 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20  CACHE },.       
162d0 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
162e0 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
162f0 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
16300 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
16310 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ACHE|SQLITE_OPEN
16320 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20  _PRIVATECACHE;. 
16330 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
16340 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20   aCacheMode;.   
16350 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
16360 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ask;.          z
16370 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68  ModeType = "cach
16380 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e";.        }.  
16390 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
163a0 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64  4 && memcmp("mod
163b0 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20  e", zOpt, 4)==0 
163c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
163d0 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d  tic struct OpenM
163e0 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20  ode aOpenMode[] 
163f0 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
16400 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f  { "ro",  SQLITE_
16410 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c  OPEN_READONLY },
16420 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
16430 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  rw",  SQLITE_OPE
16440 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a  N_READWRITE }, .
16450 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
16460 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  wc", SQLITE_OPEN
16470 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
16480 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16490 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
164a0 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54   "memory", SQLIT
164b0 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c  E_OPEN_MEMORY },
164c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
164d0 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
164e0 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
164f0 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
16500 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49  _READONLY | SQLI
16510 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
16520 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
16530 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
16540 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
16550 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a  TE_OPEN_MEMORY;.
16560 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
16570 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20  = aOpenMode;.   
16580 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
16590 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20  ask & flags;.   
165a0 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
165b0 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20   = "access";.   
165c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
165d0 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20  if( aMode ){.   
165e0 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
165f0 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
16600 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
16610 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69  for(i=0; aMode[i
16620 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ].z; i++){.     
16630 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
16640 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  r *z = aMode[i].
16650 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  z;.            i
16660 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33  f( nVal==sqlite3
16670 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30  Strlen30(z) && 0
16680 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a  ==memcmp(zVal, z
16690 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  , nVal) ){.     
166a0 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20           mode = 
166b0 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20  aMode[i].mode;. 
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
166d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
166e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
166f0 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65          if( mode
16700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16710 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
16720 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
16730 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a  no such %s mode:
16740 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c   %s", zModeType,
16750 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
16760 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16770 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
16780 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
16790 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
167a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
167b0 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45   (mode & ~SQLITE
167c0 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69  _OPEN_MEMORY)>li
167d0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
167e0 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
167f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
16800 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f  %s mode not allo
16810 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  wed: %s",.      
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61    zModeType, zVa
16850 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
16860 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d  rc = SQLITE_PERM
16870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
16880 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
16890 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
168a0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
168b0 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20  (flags & ~mask) 
168c0 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  | mode;.        
168d0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
168e0 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56   zOpt = &zVal[nV
168f0 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  al+1];.    }..  
16900 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65  }else{.    zFile
16910 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
16920 63 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20  c64(nUri+2);.   
16930 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
16940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
16950 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  M_BKPT;.    if( 
16960 6e 55 72 69 20 29 7b 0a 20 20 20 20 20 20 6d 65  nUri ){.      me
16970 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69  mcpy(zFile, zUri
16980 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7d 0a 20  , nUri);.    }. 
16990 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d     zFile[nUri] =
169a0 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
169b0 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b  [nUri+1] = '\0';
169c0 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
169d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
169e0 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20    }..  *ppVfs = 
169f0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
16a00 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70  (zVfs);.  if( *p
16a10 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  pVfs==0 ){.    *
16a20 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
16a30 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
16a40 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56  uch vfs: %s", zV
16a50 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  fs);.    rc = SQ
16a60 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
16a70 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a   parse_uri_out:.
16a80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16a90 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
16aa0 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a  e3_free(zFile);.
16ab0 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20      zFile = 0;. 
16ac0 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66   }.  *pFlags = f
16ad0 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20  lags;.  *pzFile 
16ae0 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  = zFile;.  retur
16af0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
16b00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
16b10 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70  s the work of op
16b20 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ening a database
16b30 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a   on behalf of.**
16b40 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
16b50 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  and sqlite3_open
16b60 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61  16(). The databa
16b70 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69  se filename "zFi
16b80 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20  lename"  .** is 
16b90 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a  UTF-8 encoded..*
16ba0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
16bb0 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e  nDatabase(.  con
16bc0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
16bd0 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20  me, /* Database 
16be0 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65  filename UTF-8 e
16bf0 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  ncoded */.  sqli
16c00 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
16c10 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
16c20 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ned database han
16c30 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  dle */.  unsigne
16c40 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20  d int flags,    
16c50 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66  /* Operational f
16c60 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
16c70 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
16c80 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16c90 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  VFS to use */.){
16ca0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cc0 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f     /* Store allo
16cd0 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72  cated handle her
16ce0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d00 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
16d10 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
16d20 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20  sThreadsafe;    
16d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
16d40 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66  ue for threadsaf
16d50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
16d60 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d  .  char *zOpen =
16d70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16d80 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
16d90 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
16da0 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a  to BtreeOpen() *
16db0 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  /.  char *zErrMs
16dc0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
16dd0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
16de0 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  sage from sqlite
16df0 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a  3ParseUri() */..
16e00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16e10 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
16e20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
16e30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
16e40 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
16e50 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
16e60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16e70 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
16e80 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
16e90 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
16ea0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
16eb0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ndif..  /* Only 
16ec0 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
16ed0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
16ee0 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
16ef0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
16f00 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
16f10 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
16f20 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
16f30 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
16f40 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
16f50 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
16f60 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
16f70 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
16f80 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
16f90 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
16fa0 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
16fb0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
16fc0 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
16fd0 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
16fe0 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
16ff0 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
17000 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
17010 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
17020 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
17030 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17040 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17060 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
17070 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
17080 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
17090 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
170a0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
170b0 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
170c0 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
170d0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
170e0 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
170f0 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
17100 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
17110 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
17120 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
17130 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
17140 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
17150 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
17160 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
17170 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
17180 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20   & 0x46)==0 ){. 
17190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
171a0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f  _MISUSE_BKPT;  /
171b0 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34  * IMP: R-65497-4
171c0 34 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69  4594 */.  }..  i
171d0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
171e0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
171f0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68  x==0 ){.    isTh
17200 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
17210 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
17220 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  & SQLITE_OPEN_NO
17230 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
17240 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
17250 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
17260 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   & SQLITE_OPEN_F
17270 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  ULLMUTEX ){.    
17280 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31  isThreadsafe = 1
17290 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
172a0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71  sThreadsafe = sq
172b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
172c0 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20  g.bFullMutex;.  
172d0 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  }.  if( flags & 
172e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
172f0 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20  ATECACHE ){.    
17300 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
17310 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
17320 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  E;.  }else if( s
17330 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17340 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
17350 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61  abled ){.    fla
17360 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
17370 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
17380 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
17390 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
173a0 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
173b0 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
173c0 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
173d0 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
173e0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
173f0 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
17400 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
17410 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
17420 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
17430 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
17440 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
17450 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
17460 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
17470 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
17480 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
17490 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
174a0 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ITE, SQLITE_OPEN
174b0 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f  _CREATE, SQLITE_
174c0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
174d0 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
174e0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c  EN_PRIVATECACHE,
174f0 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76   and some reserv
17500 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74  ed bits.  Silent
17510 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66  ly mask.  ** off
17520 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
17530 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26  ..  */.  flags &
17540 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45  =  ~( SQLITE_OPE
17550 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
17560 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
17570 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
17580 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
17590 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
175a0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20  PEN_MAIN_DB |.  
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
175c0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
175d0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
175e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
175f0 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20  RANSIENT_DB | . 
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
17610 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
17620 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
17630 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
17640 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
17650 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
17660 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
17670 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  SUBJOURNAL | .  
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17690 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
176a0 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20  JOURNAL |.      
176b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
176c0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20  OPEN_NOMUTEX |. 
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
176e0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
176f0 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
17700 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17710 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  _WAL.           
17720 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    );..  /* Alloc
17730 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
17740 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
17750 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d  .  db = sqlite3M
17760 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
17770 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20  f(sqlite3) );.  
17780 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f  if( db==0 ) goto
17790 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69   opendb_out;.  i
177a0 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20  f( isThreadsafe 
177b0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78  ){.    db->mutex
177c0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
177d0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
177e0 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
177f0 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d    if( db->mutex=
17800 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
17810 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20  te3_free(db);.  
17820 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20      db = 0;.    
17830 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
17840 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
17850 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
17860 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
17870 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30   db->errMask = 0
17880 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  xff;.  db->nDb =
17890 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   2;.  db->magic 
178a0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
178b0 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d  USY;.  db->aDb =
178c0 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
178d0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
178e0 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73  f(db->aLimit)==s
178f0 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74  izeof(aHardLimit
17900 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62  ) );.  memcpy(db
17910 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c  ->aLimit, aHardL
17920 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d  imit, sizeof(db-
17930 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d  >aLimit));.  db-
17940 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
17950 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
17960 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45  ADS] = SQLITE_DE
17970 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52  FAULT_WORKER_THR
17980 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f  EADS;.  db->auto
17990 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62  Commit = 1;.  db
179a0 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20  ->nextAutovac = 
179b0 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70  -1;.  db->szMmap
179c0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
179d0 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20  Config.szMmap;. 
179e0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
179f0 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61  e = 0;.  db->nMa
17a00 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78  xSorterMmap = 0x
17a10 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e  7FFFFFFF;.  db->
17a20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
17a30 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20  ShortColNames | 
17a40 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
17a50 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61  gger | SQLITE_Ca
17a60 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65  cheSpill.#if !de
17a70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46  fined(SQLITE_DEF
17a80 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
17a90 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f  NDEX) || SQLITE_
17aa0 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49  DEFAULT_AUTOMATI
17ab0 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20  C_INDEX.        
17ac0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17ad0 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64  E_AutoIndex.#end
17ae0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
17af0 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53  FAULT_CKPTFULLFS
17b00 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20 20 20  YNC.            
17b10 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b       | SQLITE_Ck
17b20 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64  ptFullFSync.#end
17b30 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
17b40 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41  FAULT_FILE_FORMA
17b50 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20  T<4.            
17b60 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65       | SQLITE_Le
17b70 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64  gacyFileFmt.#end
17b80 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
17b90 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
17ba0 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ENSION.         
17bb0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
17bc0 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23  _LoadExtension.#
17bd0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
17be0 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49  _DEFAULT_RECURSI
17bf0 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20  VE_TRIGGERS.    
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17c10 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72  QLITE_RecTrigger
17c20 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  s.#endif.#if def
17c30 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
17c40 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
17c50 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41  ) && SQLITE_DEFA
17c60 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
17c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c80 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69    | SQLITE_Forei
17c90 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69  gnKeys.#endif.#i
17ca0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
17cb0 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52  _REVERSE_UNORDER
17cc0 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20  ED_SELECTS).    
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17ce0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
17cf0 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  er.#endif.#if de
17d00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
17d10 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
17d20 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20  L_CHECK).       
17d30 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17d40 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65  TE_CellSizeCk.#e
17d50 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
17d60 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  (SQLITE_ENABLE_F
17d70 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 29 0a 20  TS3_TOKENIZER). 
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 7c 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b  | SQLITE_Fts3Tok
17da0 65 6e 69 7a 65 72 0a 23 65 6e 64 69 66 0a 20 20  enizer.#endif.  
17db0 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48      ;.  sqlite3H
17dc0 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f  ashInit(&db->aCo
17dd0 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
17de0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
17df0 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  UALTABLE.  sqlit
17e00 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
17e10 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
17e20 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64  ..  /* Add the d
17e30 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
17e40 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
17e50 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66  . BINARY works f
17e60 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20  or both UTF-8.  
17e70 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73  ** and UTF-16, s
17e80 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20  o add a version 
17e90 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69  for each to avoi
17ea0 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72  d any unnecessar
17eb0 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f  y.  ** conversio
17ec0 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72  ns. The only err
17ed0 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75  or that can occu
17ee0 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c  r here is a mall
17ef0 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20  oc() failure..  
17f00 2a 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  **.  ** EVIDENCE
17f10 2d 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38  -OF: R-52786-448
17f20 37 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65  78 SQLite define
17f30 73 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e  s three built-in
17f40 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20   collating.  ** 
17f50 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a  functions:.  */.
17f60 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
17f70 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72  n(db, sqlite3Str
17f80 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55  BINARY, SQLITE_U
17f90 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  TF8, 0, binCollF
17fa0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
17fb0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73  eCollation(db, s
17fc0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
17fd0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
17fe0 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
17ff0 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
18000 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74  lation(db, sqlit
18010 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c  e3StrBINARY, SQL
18020 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20  ITE_UTF16LE, 0, 
18030 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
18040 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
18050 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c  on(db, "NOCASE",
18060 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
18070 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
18080 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
18090 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
180a0 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f  "RTRIM", SQLITE_
180b0 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20  UTF8, (void*)1, 
180c0 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
180d0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
180e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
180f0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
18100 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43    }.  /* EVIDENC
18110 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31 37  E-OF: R-08308-17
18120 32 32 34 20 54 68 65 20 64 65 66 61 75 6c 74 20  224 The default 
18130 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
18140 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20  on for all.  ** 
18150 73 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41 52  strings is BINAR
18160 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70  Y. .  */.  db->p
18170 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  DfltColl = sqlit
18180 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
18190 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73  , SQLITE_UTF8, s
181a0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
181b0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64   0);.  assert( d
181c0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20  b->pDfltColl!=0 
181d0 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  );..  /* Parse t
181e0 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20  he filename/URI 
181f0 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64  argument. */.  d
18200 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  b->openFlags = f
18210 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c  lags;.  rc = sql
18220 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66  ite3ParseUri(zVf
18230 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  s, zFilename, &f
18240 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c  lags, &db->pVfs,
18250 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73   &zOpen, &zErrMs
18260 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
18270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
18280 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
18290 4d 45 4d 20 29 20 73 71 6c 69 74 65 33 4f 6f 6d  MEM ) sqlite3Oom
182a0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 73  Fault(db);.    s
182b0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
182c0 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d  sg(db, rc, zErrM
182d0 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a  sg ? "%s" : 0, z
182e0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
182f0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
18300 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  g);.    goto ope
18310 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
18320 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b  /* Open the back
18330 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69  end database dri
18340 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ver */.  rc = sq
18350 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
18360 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20  b->pVfs, zOpen, 
18370 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e  db, &db->aDb[0].
18380 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBt, 0,.        
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183a0 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
183b0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20  PEN_MAIN_DB);.  
183c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
183d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
183e0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
183f0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  MEM ){.      rc 
18400 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
18410 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  KPT;.    }.    s
18420 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
18430 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  rc);.    goto op
18440 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
18450 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18460 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  r(db->aDb[0].pBt
18470 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  );.  db->aDb[0].
18480 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
18490 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64  3SchemaGet(db, d
184a0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
184b0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
184c0 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64 62  cFailed ) ENC(db
184d0 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64  ) = SCHEMA_ENC(d
184e0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
184f0 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62 5b  eeLeave(db->aDb[
18500 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
18510 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[1].pSchema = 
18520 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
18530 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54  (db, 0);..  /* T
18540 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74  he default safet
18550 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  y_level for the 
18560 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
18570 20 46 55 4c 4c 3b 20 66 6f 72 20 74 68 65 20 74   FULL; for the t
18580 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  emp.  ** databas
18590 65 20 69 74 20 69 73 20 4f 46 46 2e 20 54 68 69  e it is OFF. Thi
185a0 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  s matches the pa
185b0 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c  ger layer defaul
185c0 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ts.  .  */.  db-
185d0 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[0].zDbSName
185e0 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d   = "main";.  db-
185f0 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[0].safety_l
18600 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45  evel = SQLITE_DE
18610 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55  FAULT_SYNCHRONOU
18620 53 2b 31 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  S+1;.  db->aDb[1
18630 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 74 65  ].zDbSName = "te
18640 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  mp";.  db->aDb[1
18650 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
18660 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
18670 55 53 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e 6d  US_OFF;..  db->m
18680 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
18690 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20  GIC_OPEN;.  if( 
186a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
186b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
186c0 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
186d0 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
186e0 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
186f0 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61  ns, but do not a
18700 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
18710 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
18720 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69   schema yet. Thi
18730 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
18740 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  il the first tim
18750 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
18760 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e   ** is accessed.
18770 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
18780 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
18790 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  OK);.  sqlite3Re
187a0 67 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74  gisterPerConnect
187b0 69 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  ionBuiltinFuncti
187c0 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  ons(db);.  rc = 
187d0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
187e0 64 62 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  db);..#ifdef SQL
187f0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a  ITE_ENABLE_FTS5.
18800 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6e    /* Register an
18810 79 20 62 75 69 6c 74 2d 69 6e 20 46 54 53 35 20  y built-in FTS5 
18820 6d 6f 64 75 6c 65 20 62 65 66 6f 72 65 20 6c 6f  module before lo
18830 61 64 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61  ading the automa
18840 74 69 63 0a 20 20 2a 2a 20 65 78 74 65 6e 73 69  tic.  ** extensi
18850 6f 6e 73 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ons. This allows
18860 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e   automatic exten
18870 73 69 6f 6e 73 20 74 6f 20 72 65 67 69 73 74 65  sions to registe
18880 72 20 46 54 53 35 20 0a 20 20 2a 2a 20 74 6f 6b  r FTS5 .  ** tok
18890 65 6e 69 7a 65 72 73 20 61 6e 64 20 61 75 78 69  enizers and auxi
188a0 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e  liary functions.
188b0 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
188c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
188d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
188e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
188f0 33 46 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts5Init(db);. 
18900 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
18910 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65  Load automatic e
18920 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65  xtensions - exte
18930 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  nsions that have
18940 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
18950 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
18960 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69  sqlite3_automati
18970 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50  c_extension() AP
18980 49 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  I..  */.  if( rc
18990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
189a0 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f     sqlite3AutoLo
189b0 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  adExtensions(db)
189c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
189d0 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
189e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
189f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
18a00 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
18a10 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
18a20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18a30 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS1.  if( !db->
18a40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
18a50 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
18a60 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73  qlite3Fts1Init(s
18a70 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
18a80 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e   = sqlite3Fts1In
18a90 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
18aa0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18ab0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20  E_ENABLE_FTS2.  
18ac0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18ad0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
18ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
18af0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
18b00 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts2Init(sqlite3
18b10 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
18b20 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29  ite3Fts2Init(db)
18b30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
18b40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18b50 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f 6d  LE_FTS3 /* autom
18b60 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e 65 64  atically defined
18b70 20 62 79 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   by SQLITE_ENABL
18b80 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66 28 20  E_FTS4 */.  if( 
18b90 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
18ba0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
18bb0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
18bc0 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64  qlite3Fts3Init(d
18bd0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
18be0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18bf0 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21  ABLE_ICU.  if( !
18c00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18c10 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
18c20 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
18c30 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
18c40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
18c50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18c60 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
18c70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18c80 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
18c90 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
18ca0 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
18cb0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
18cc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18cd0 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42 0a  BLE_DBSTAT_VTAB.
18ce0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
18cf0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
18d00 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
18d10 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74 61  c = sqlite3Dbsta
18d20 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20  tRegister(db);. 
18d30 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
18d40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18d50 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64 62 2d  JSON1.  if( !db-
18d60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
18d70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
18d80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18d90 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a  3Json1Init(db);.
18da0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18db0 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
18dc0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31  T_LOCKING_MODE=1
18dd0 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45   makes EXCLUSIVE
18de0 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
18df0 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
18e00 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
18e10 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30  T_LOCKING_MODE=0
18e20 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65   make NORMAL the
18e30 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
18e40 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69  .  ** mode.  Doi
18e50 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c  ng nothing at al
18e60 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52  l also makes NOR
18e70 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e  MAL the default.
18e80 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
18e90 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
18ea0 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64  ING_MODE.  db->d
18eb0 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51  fltLockMode = SQ
18ec0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
18ed0 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c  KING_MODE;.  sql
18ee0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
18ef0 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
18f00 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
18f10 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
18f40 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a  _LOCKING_MODE);.
18f50 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
18f60 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28   ) sqlite3Error(
18f70 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45  db, rc);..  /* E
18f80 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73  nable the lookas
18f90 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79  ide-malloc subsy
18fa0 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c  stem */.  setupL
18fb0 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20  ookaside(db, 0, 
18fc0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18fd0 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c  fig.szLookaside,
18fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ff0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19000 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
19010 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c  okaside);..  sql
19020 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
19030 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49  ckpoint(db, SQLI
19040 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41  TE_DEFAULT_WAL_A
19050 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a  UTOCHECKPOINT);.
19060 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69  .opendb_out:.  i
19070 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73  f( db ){.    ass
19080 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d  ert( db->mutex!=
19090 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66  0 || isThreadsaf
190a0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
190b0 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
190c0 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
190d0 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
190e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
190f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
19100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
19110 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73  rrcode(db);.  as
19120 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72  sert( db!=0 || r
19130 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
19140 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19150 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
19160 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
19170 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a  b);.    db = 0;.
19180 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
19190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
191a0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
191b0 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a  ITE_MAGIC_SICK;.
191c0 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62    }.  *ppDb = db
191d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
191e0 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
191f0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
19200 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
19210 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e  ){.    /* Openin
19220 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46  g a db handle. F
19230 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20  ourth parameter 
19240 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a  is passed 0. */.
19250 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d      void *pArg =
19260 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
19270 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b  nfig.pSqllogArg;
19280 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
19290 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
192a0 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65  (pArg, db, zFile
192b0 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  name, 0);.  }.#e
192c0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
192d0 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
192e0 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  C).  if( rc==SQL
192f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
19300 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a  nst char *zKey;.
19310 20 20 20 20 69 66 28 20 28 7a 4b 65 79 20 3d 20      if( (zKey = 
19320 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
19330 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65  meter(zOpen, "he
19340 78 6b 65 79 22 29 29 21 3d 30 20 26 26 20 7a 4b  xkey"))!=0 && zK
19350 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 75  ey[0] ){.      u
19360 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69  8 iByte;.      i
19370 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72  nt i;.      char
19380 20 7a 44 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20   zDecoded[40];. 
19390 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42       for(i=0, iB
193a0 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  yte=0; i<sizeof(
193b0 7a 44 65 63 6f 64 65 64 29 2a 32 20 26 26 20 73  zDecoded)*2 && s
193c0 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
193d0 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Key[i]); i++){. 
193e0 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28         iByte = (
193f0 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69  iByte<<4) + sqli
19400 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 4b 65 79  te3HexToInt(zKey
19410 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [i]);.        if
19420 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 44 65  ( (i&1)!=0 ) zDe
19430 63 6f 64 65 64 5b 69 2f 32 5d 20 3d 20 69 42 79  coded[i/2] = iBy
19440 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
19450 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32    sqlite3_key_v2
19460 28 64 62 2c 20 30 2c 20 7a 44 65 63 6f 64 65 64  (db, 0, zDecoded
19470 2c 20 69 2f 32 29 3b 0a 20 20 20 20 7d 65 6c 73  , i/2);.    }els
19480 65 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71  e if( (zKey = sq
19490 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
194a0 74 65 72 28 7a 4f 70 65 6e 2c 20 22 6b 65 79 22  ter(zOpen, "key"
194b0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
194c0 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
194d0 2c 20 30 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74  , 0, zKey, sqlit
194e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29  e3Strlen30(zKey)
194f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
19500 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
19510 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74  ee(zOpen);.  ret
19520 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d  urn rc & 0xff;.}
19530 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
19540 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
19550 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
19560 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  e3_open(.  const
19570 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
19580 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
19590 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e  pDb .){.  return
195a0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
195b0 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20  ilename, ppDb,. 
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
195e0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
195f0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
19600 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
19610 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f  e3_open_v2(.  co
19620 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  nst char *filena
19630 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73  me,   /* Databas
19640 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d  e filename (UTF-
19650 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  8) */.  sqlite3 
19660 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20  **ppDb,         
19670 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64  /* OUT: SQLite d
19680 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
19690 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
196a0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a        /* Flags *
196b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
196c0 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e  zVfs        /* N
196d0 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c  ame of VFS modul
196e0 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  e to use */.){. 
196f0 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
19700 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70  base(filename, p
19710 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  pDb, (unsigned i
19720 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  nt)flags, zVfs);
19730 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
19740 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
19750 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
19760 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
19770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
19780 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76  pen16(.  const v
19790 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  oid *zFilename, 
197a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
197b0 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  b.){.  char cons
197c0 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20  t *zFilename8;  
197d0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e   /* zFilename en
197e0 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69  coded in UTF-8 i
197f0 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36  nstead of UTF-16
19800 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
19810 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
19820 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
19830 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
19840 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d  RMOR.  if( ppDb=
19850 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
19860 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
19870 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
19880 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
19890 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
198a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
198b0 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
198c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
198d0 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  rc;.#endif.  if(
198e0 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20   zFilename==0 ) 
198f0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30  zFilename = "\00
19900 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d  0\000";.  pVal =
19910 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
19920 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
19930 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
19940 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53  -1, zFilename, S
19950 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
19960 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
19970 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20  );.  zFilename8 
19980 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
19990 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
199a0 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69  UTF8);.  if( zFi
199b0 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72  lename8 ){.    r
199c0 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65  c = openDatabase
199d0 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44  (zFilename8, ppD
199e0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
199f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19a00 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
19a10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
19a20 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  ATE, 0);.    ass
19a30 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63  ert( *ppDb || rc
19a40 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
19a50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19a60 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61  LITE_OK && !DbHa
19a70 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c  sProperty(*ppDb,
19a80 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
19a90 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43  ded) ){.      SC
19aa0 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20  HEMA_ENC(*ppDb) 
19ab0 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53  = ENC(*ppDb) = S
19ac0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
19ad0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
19ae0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19af0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
19b00 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  }.  sqlite3Value
19b10 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
19b20 65 74 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b  eturn rc & 0xff;
19b30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
19b40 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
19b50 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
19b60 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
19b70 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
19b80 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
19b90 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
19ba0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
19bb0 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
19bc0 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
19bd0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
19be0 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
19bf0 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
19c00 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
19c10 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
19c20 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
19c30 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
19c40 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
19c50 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61  ation_v2(db, zNa
19c60 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  me, enc, pCtx, x
19c70 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a  Compare, 0);.}..
19c80 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
19c90 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
19ca0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
19cb0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19cc0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
19cd0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
19ce0 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
19cf0 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
19d00 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
19d10 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
19d20 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
19d30 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
19d40 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
19d50 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
19d60 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
19d70 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
19d80 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  rc;..#ifdef SQLI
19d90 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
19da0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
19db0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
19dc0 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
19dd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19de0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
19df0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
19e00 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
19e10 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
19e20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
19e30 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
19e40 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
19e50 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20  zName, (u8)enc, 
19e60 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
19e70 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71  xDel);.  rc = sq
19e80 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
19e90 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
19ea0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
19eb0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
19ec0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19ed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
19ee0 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  6./*.** Register
19ef0 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
19f00 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
19f10 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
19f20 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
19f30 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
19f40 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  lation16(.  sqli
19f50 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
19f60 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20  t void *zName,. 
19f70 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
19f80 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
19f90 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
19fa0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
19fb0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
19fc0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
19fd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
19fe0 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65   *zName8;..#ifde
19ff0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a000 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1a010 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1a020 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
1a030 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  me==0 ) return S
1a040 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1a050 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1a060 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1a070 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
1a080 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
1a090 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61  cFailed );.  zNa
1a0a0 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  me8 = sqlite3Utf
1a0b0 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c  16to8(db, zName,
1a0c0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31   -1, SQLITE_UTF1
1a0d0 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20  6NATIVE);.  if( 
1a0e0 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63  zName8 ){.    rc
1a0f0 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
1a100 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28  on(db, zName8, (
1a110 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
1a120 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20  ompare, 0);.    
1a130 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1a140 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20  , zName8);.  }. 
1a150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1a160 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1a170 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a180 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1a190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1a1a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a1b0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
1a1c0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1a1d0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a1e0 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
1a1f0 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
1a200 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
1a210 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
1a220 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
1a230 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
1a240 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
1a250 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a260 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
1a270 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a280 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
1a290 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
1a2a0 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28  d(*xCollNeeded)(
1a2b0 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
1a2c0 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
1a2d0 74 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64  t char*).){.#ifd
1a2e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a2f0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1a300 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1a310 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
1a320 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1a330 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1a340 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a350 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1a360 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
1a370 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  ed = xCollNeeded
1a380 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
1a390 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d  ded16 = 0;.  db-
1a3a0 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
1a3b0 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
1a3c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1a3d0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1a3e0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1a3f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1a400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1a410 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
1a420 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
1a430 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
1a440 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
1a450 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
1a460 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
1a470 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
1a480 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
1a490 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
1a4a0 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
1a4b0 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
1a4c0 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69  needed16(.  sqli
1a4d0 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
1a4e0 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
1a4f0 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
1a500 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c  Needed16)(void*,
1a510 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
1a520 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64  xtRep,const void
1a530 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *).){.#ifdef SQL
1a540 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1a550 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1a560 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1a570 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1a580 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1a590 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1a5a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1a5b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
1a5c0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30  >xCollNeeded = 0
1a5d0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
1a5e0 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65  ded16 = xCollNee
1a5f0 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f  ded16;.  db->pCo
1a600 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
1a610 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
1a620 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a630 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1a640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a650 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1a660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1a670 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
1a680 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
1a690 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
1a6a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
1a6b0 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20  an anachronism. 
1a6c0 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73  It used to be us
1a6d0 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ed to recover fr
1a6e0 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  om a.** malloc()
1a6f0 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51   failure, but SQ
1a700 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68  Lite now does th
1a710 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1a720 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a730 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
1a740 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1a750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1a760 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  dif../*.** Test 
1a770 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
1a780 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  r not the databa
1a790 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
1a7a0 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a   in autocommit.*
1a7b0 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  * mode.  Return 
1a7c0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e  TRUE if it is an
1a7d0 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20  d FALSE if not. 
1a7e0 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   Autocommit mode
1a7f0 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66   is on.** by def
1a800 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69  ault.  Autocommi
1a810 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79  t is disabled by
1a820 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
1a830 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64  nt and reenabled
1a840 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20  .** by the next 
1a850 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
1a860 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
1a870 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
1a880 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
1a890 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a8a0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1a8b0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1a8c0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1a8d0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
1a8e0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1a8f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a900 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1a910 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  n db->autoCommit
1a920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
1a930 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1a940 73 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65  s are substitute
1a950 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  s for constants 
1a960 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a  SQLITE_CORRUPT,.
1a970 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ** SQLITE_MISUSE
1a980 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
1a990 4e 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  N, SQLITE_NOMEM 
1a9a0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68  and possibly oth
1a9b0 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73  er error.** cons
1a9c0 74 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72  tants.  They ser
1a9d0 76 65 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a  ve two purposes:
1a9e0 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72  .**.**   1.  Ser
1a9f0 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65  ve as a convenie
1aa00 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20  nt place to set 
1aa10 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20  a breakpoint in 
1aa20 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20  a debugger.**   
1aa30 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68      to detect wh
1aa40 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72  en version error
1aa50 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75   conditions occu
1aa60 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20  rs..**.**   2.  
1aa70 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c  Invoke sqlite3_l
1aa80 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20  og() to provide 
1aa90 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20  the source code 
1aaa0 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a  location where.*
1aab0 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65  *       a low-le
1aac0 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72  vel error is fir
1aad0 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a  st detected..*/.
1aae0 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 6f 72  static int repor
1aaf0 74 45 72 72 6f 72 28 69 6e 74 20 69 45 72 72 2c  tError(int iErr,
1ab00 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e   int lineno, con
1ab10 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b  st char *zType){
1ab20 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69  .  sqlite3_log(i
1ab30 45 72 72 2c 20 22 25 73 20 61 74 20 6c 69 6e 65  Err, "%s at line
1ab40 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
1ab50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
1ab60 54 79 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30  Type, lineno, 20
1ab70 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
1ab80 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  d());.  return i
1ab90 45 72 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  Err;.}.int sqlit
1aba0 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
1abb0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1abc0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1abd0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1abe0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1abf0 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1ac00 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65  TE_CORRUPT, line
1ac10 6e 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f  no, "database co
1ac20 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e  rruption");.}.in
1ac30 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
1ac40 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1ac50 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1ac60 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ac70 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1ac80 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f  eturn reportErro
1ac90 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  r(SQLITE_MISUSE,
1aca0 20 6c 69 6e 65 6e 6f 2c 20 22 6d 69 73 75 73 65   lineno, "misuse
1acb0 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ");.}.int sqlite
1acc0 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69  3CantopenError(i
1acd0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1ace0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1acf0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1ad00 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1ad10 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1ad20 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e  TE_CANTOPEN, lin
1ad30 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  eno, "cannot ope
1ad40 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64  n file");.}.#ifd
1ad50 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ad60 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d  int sqlite3Nomem
1ad70 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1ad80 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
1ad90 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ada0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1adb0 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72  return reportErr
1adc0 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  or(SQLITE_NOMEM,
1add0 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b   lineno, "OOM");
1ade0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f  .}.int sqlite3Io
1adf0 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e  errnomemError(in
1ae00 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1ae10 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1ae20 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1ae30 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
1ae40 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1ae50 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c  E_IOERR_NOMEM, l
1ae60 69 6e 65 6e 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20  ineno, "I/O OOM 
1ae70 65 72 72 6f 72 22 29 3b 0a 7d 0a 23 65 6e 64 69  error");.}.#endi
1ae80 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1ae90 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1aea0 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  D./*.** This is 
1aeb0 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f  a convenience ro
1aec0 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73  utine that makes
1aed0 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
1aee0 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a  hread-specific.*
1aef0 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  * data for this 
1af00 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20  thread has been 
1af10 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  deallocated..**.
1af20 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e  ** SQLite no lon
1af30 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d  ger uses thread-
1af40 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f  specific data so
1af50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1af60 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e   now a.** no-op.
1af70 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64    It is retained
1af80 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
1af90 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a  compatibility..*
1afa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74  /.void sqlite3_t
1afb0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f  hread_cleanup(vo
1afc0 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  id){.}.#endif../
1afd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61  *.** Return meta
1afe0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1aff0 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f  ut a specific co
1b000 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61  lumn of a databa
1b010 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65  se table..** See
1b020 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69   comment in sqli
1b030 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e  te3.h (sqlite.h.
1b040 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  in) for details.
1b050 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b060 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
1b070 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
1b080 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
1b090 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1b0a0 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
1b0b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1b0c0 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
1b0d0 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
1b0e0 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
1b0f0 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
1b100 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
1b110 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
1b120 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
1b130 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
1b140 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
1b150 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
1b160 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
1b170 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
1b180 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
1b190 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
1b1a0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
1b1b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1b1c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
1b1d0 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
1b1e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
1b1f0 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
1b200 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
1b210 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
1b220 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
1b230 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
1b240 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
1b250 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
1b260 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
1b270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1b280 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
1b290 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
1b2a0 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
1b2b0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
1b2c0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
1b2d0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
1b2e0 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
1b2f0 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
1b300 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
1b310 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
1b320 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1b330 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
1b340 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
1b350 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
1b360 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
1b370 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65  inc = 0;...#ifde
1b380 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b390 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1b3a0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1b3b0 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61  eckOk(db) || zTa
1b3c0 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  bleName==0 ){.  
1b3d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b3e0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
1b3f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
1b400 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
1b410 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
1b420 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
1b430 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b440 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1b450 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b460 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d  rAll(db);.  rc =
1b470 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
1b480 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
1b490 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1b4a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
1b4b0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
1b4c0 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
1b4d0 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
1b4e0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1b4f0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
1b500 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
1b510 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
1b520 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
1b530 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
1b540 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
1b550 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
1b560 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
1b570 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
1b580 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
1b590 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d    if( zColumnNam
1b5a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51  e==0 ){.    /* Q
1b5b0 75 65 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e  uery for existan
1b5c0 63 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79  ce of table only
1b5d0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1b5e0 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
1b5f0 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
1b600 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
1b610 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
1b620 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
1b630 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
1b640 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
1b650 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
1b660 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b670 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b680 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
1b690 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  >nCol ){.      i
1b6a0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1b6b0 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  ) && sqlite3IsRo
1b6c0 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  wid(zColumnName)
1b6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
1b6e0 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
1b6f0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69          pCol = i
1b700 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e  Col>=0 ? &pTab->
1b710 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a  aCol[iCol] : 0;.
1b720 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b730 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20       pTab = 0;. 
1b740 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f         goto erro
1b750 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
1b760 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
1b770 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
1b780 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
1b790 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
1b7a0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
1b7b0 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
1b7c0 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
1b7d0 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
1b7e0 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
1b7f0 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
1b800 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
1b810 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
1b820 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
1b830 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
1b840 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
1b850 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
1b860 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
1b870 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
1b880 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
1b890 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
1b8a0 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
1b8b0 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
1b8c0 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
1b8d0 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
1b8e0 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
1b8f0 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
1b900 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
1b910 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
1b920 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
1b930 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
1b940 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
1b950 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
1b960 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
1b970 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
1b980 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  e = sqlite3Colum
1b990 6e 54 79 70 65 28 70 43 6f 6c 2c 30 29 3b 0a 20  nType(pCol,0);. 
1b9a0 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43     zCollSeq = pC
1b9b0 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e  ol->zColl;.    n
1b9c0 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e  otnull = pCol->n
1b9d0 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70  otNull!=0;.    p
1b9e0 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43  rimarykey  = (pC
1b9f0 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43  ol->colFlags & C
1ba00 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
1ba10 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20  =0;.    autoinc 
1ba20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69  = pTab->iPKey==i
1ba30 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61  Col && (pTab->ta
1ba40 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
1ba50 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20  increment)!=0;. 
1ba60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74   }else{.    zDat
1ba70 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  aType = "INTEGER
1ba80 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  ";.    primaryke
1ba90 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 1;.  }.  if(
1baa0 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20   !zCollSeq ){.  
1bab0 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c    zCollSeq = sql
1bac0 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1bad0 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20   }..error_out:. 
1bae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1baf0 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a  veAll(db);..  /*
1bb00 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e   Whether the fun
1bb10 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65  ction call succe
1bb20 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20  eded or failed, 
1bb30 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
1bb40 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74  arameters.  ** t
1bb50 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72  o whatever their
1bb60 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61   local counterpa
1bb70 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20  rts contain. If 
1bb80 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63  an error did occ
1bb90 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61  ur,.  ** this ha
1bba0 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
1bbb0 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70  zeroing all outp
1bbc0 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ut parameters.. 
1bbd0 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61   */.  if( pzData
1bbe0 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79  Type ) *pzDataTy
1bbf0 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a  pe = zDataType;.
1bc00 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20    if( pzCollSeq 
1bc10 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a  ) *pzCollSeq = z
1bc20 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70  CollSeq;.  if( p
1bc30 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e  NotNull ) *pNotN
1bc40 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20  ull = notnull;. 
1bc50 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79   if( pPrimaryKey
1bc60 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20   ) *pPrimaryKey 
1bc70 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  = primarykey;.  
1bc80 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a  if( pAutoinc ) *
1bc90 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69  pAutoinc = autoi
1bca0 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  nc;..  if( SQLIT
1bcb0 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61  E_OK==rc && !pTa
1bcc0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
1bcd0 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
1bce0 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67  sg);.    zErrMsg
1bcf0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1bd00 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74  f(db, "no such t
1bd10 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e  able column: %s.
1bd20 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  %s", zTableName,
1bd30 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e  .        zColumn
1bd40 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
1bd50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1bd60 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
1bd70 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20  WithMsg(db, rc, 
1bd80 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29  (zErrMsg?"%s":0)
1bd90 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
1bda0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1bdb0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d  zErrMsg);.  rc =
1bdc0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
1bdd0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
1bde0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1bdf0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
1be00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1be10 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
1be20 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
1be30 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
1be40 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
1be50 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  int sqlite3_slee
1be60 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c  p(int ms){.  sql
1be70 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
1be80 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73    int rc;.  pVfs
1be90 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
1bea0 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56  ind(0);.  if( pV
1beb0 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  fs==0 ) return 0
1bec0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
1bed0 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d  ction works in m
1bee0 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74  illiseconds, but
1bef0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1bf00 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20  OsSleep() .  ** 
1bf10 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65  API uses microse
1bf20 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65  conds. Hence the
1bf30 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20   1000's..  */.  
1bf40 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53  rc = (sqlite3OsS
1bf50 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a  leep(pVfs, 1000*
1bf60 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74  ms)/1000);.  ret
1bf70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bf80 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
1bf90 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20  le the extended 
1bfa0 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f  result codes..*/
1bfb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
1bfc0 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
1bfd0 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
1bfe0 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64  int onoff){.#ifd
1bff0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c000 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1c010 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1c020 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
1c030 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1c040 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1c050 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c060 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1c070 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
1c080 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
1c090 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71  fff : 0xff;.  sq
1c0a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1c0b0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1c0c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c0d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
1c0e0 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72  e the xFileContr
1c0f0 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70  ol method on a p
1c100 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
1c110 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
1c120 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1c130 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1c140 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1c150 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1c160 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  pArg){.  int rc 
1c170 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1c180 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b    Btree *pBtree;
1c190 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c1a0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1c1b0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1c1c0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1c1d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1c1e0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1c1f0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1c200 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1c210 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20  utex);.  pBtree 
1c220 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1c230 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1c240 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  me);.  if( pBtre
1c250 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  e ){.    Pager *
1c260 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  pPager;.    sqli
1c270 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20  te3_file *fd;.  
1c280 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1c290 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
1c2a0 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
1c2b0 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72  3BtreePager(pBtr
1c2c0 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ee);.    assert(
1c2d0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
1c2e0 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61    fd = sqlite3Pa
1c2f0 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b  gerFile(pPager);
1c300 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21  .    assert( fd!
1c310 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70  =0 );.    if( op
1c320 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46  ==SQLITE_FCNTL_F
1c330 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20  ILE_POINTER ){. 
1c340 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66       *(sqlite3_f
1c350 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b  ile**)pArg = fd;
1c360 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c370 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1c380 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1c390 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45  FCNTL_VFS_POINTE
1c3a0 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1c3b0 69 74 65 33 5f 76 66 73 2a 2a 29 70 41 72 67 20  ite3_vfs**)pArg 
1c3c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  = sqlite3PagerVf
1c3d0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  s(pPager);.     
1c3e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c3f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1c400 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
1c410 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20  JOURNAL_POINTER 
1c420 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1c430 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
1c440 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 72 6e   sqlite3PagerJrn
1c450 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  lFile(pPager);. 
1c460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c470 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1c480 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  f( fd->pMethods 
1c490 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1c4a0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
1c4b0 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29  ol(fd, op, pArg)
1c4c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c4d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1c4e0 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20  OTFOUND;.    }. 
1c4f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1c500 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1c510 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1c520 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1c530 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1c540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .}../*.** Interf
1c550 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69  ace to the testi
1c560 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74  ng logic..*/.int
1c570 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c580 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e  ntrol(int op, ..
1c590 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1c5a0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1c5b0 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 55 4e 55  UNTESTABLE.  UNU
1c5c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70  SED_PARAMETER(op
1c5d0 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69  );.#else.  va_li
1c5e0 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
1c5f0 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
1c600 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
1c610 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74  /*.    ** Save t
1c620 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1c630 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20   of the PRNG..  
1c640 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c650 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1c660 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20  NG_SAVE: {.     
1c670 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65   sqlite3PrngSave
1c680 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
1c690 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c6a0 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f   /*.    ** Resto
1c6b0 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  re the state of 
1c6c0 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20  the PRNG to the 
1c6d0 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64  last state saved
1c6e0 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52   using.    ** PR
1c6f0 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e  NG_SAVE.  If PRN
1c700 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72  G_SAVE has never
1c710 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c   before been cal
1c720 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
1c730 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20   this verb acts 
1c740 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e  like PRNG_RESET.
1c750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c760 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1c770 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b  _PRNG_RESTORE: {
1c780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
1c790 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29  ngRestoreState()
1c7a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c7b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1c7c0 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52   ** Reset the PR
1c7d0 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75  NG back to its u
1c7e0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61  ninitialized sta
1c7f0 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61  te.  The next ca
1c800 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
1c810 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1c820 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68  ) will reseed th
1c830 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73  e PRNG using a s
1c840 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a  ingle call.    *
1c850 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d  * to the xRandom
1c860 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74  ness method of t
1c870 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a  he default VFS..
1c880 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c890 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c8a0 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20  PRNG_RESET: {.  
1c8b0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
1c8c0 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20  omness(0,0);.   
1c8d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c8e0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1c8f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1c900 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54  trol(BITVEC_TEST
1c910 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29  , size, program)
1c920 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1c930 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73  un a test agains
1c940 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63  t a Bitvec objec
1c950 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20  t of size.  The 
1c960 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74  program argument
1c970 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72  .    ** is an ar
1c980 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
1c990 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1c9a0 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d   test.  Return -
1c9b0 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65  1 on a.    ** me
1c9c0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1c9d0 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63  error, 0 on succ
1c9e0 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  ess, or non-zero
1c9f0 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
1ca00 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71     ** See the sq
1ca10 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
1ca20 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64  inTest() for add
1ca30 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1ca40 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1ca50 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1ca60 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
1ca70 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  : {.      int sz
1ca80 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1ca90 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  t);.      int *a
1caa0 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  Prog = va_arg(ap
1cab0 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72  , int*);.      r
1cac0 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
1cad0 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c  cBuiltinTest(sz,
1cae0 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62   aProg);.      b
1caf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1cb00 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1cb10 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1cb20 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20  (FAULT_INSTALL, 
1cb30 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a  xCallback).    *
1cb40 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65  *.    ** Arrange
1cb50 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c   to invoke xCall
1cb60 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20  back() whenever 
1cb70 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1cb80 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20  ) is called,.   
1cb90 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b   ** if xCallback
1cba0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
1cbb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61    **.    ** As a
1cbc0 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61 75   test of the fau
1cbd0 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63  lt simulator mec
1cbe0 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73  hanism itself, s
1cbf0 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1cc00 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c  ).    ** is call
1cc10 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
1cc20 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20  fter installing 
1cc30 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b  the new callback
1cc40 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a   and the return.
1cc50 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f      ** value fro
1cc60 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  m sqlite3FaultSi
1cc70 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65  m(0) becomes the
1cc80 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20   return from.   
1cc90 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   ** sqlite3_test
1cca0 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20  _control()..    
1ccb0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ccc0 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c  TE_TESTCTRL_FAUL
1ccd0 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20  T_INSTALL: {.   
1cce0 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69     /* MSVC is pi
1ccf0 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e  cky about pullin
1cd00 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d  g func ptrs from
1cd10 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20   va lists..     
1cd20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f   ** http://suppo
1cd30 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d  rt.microsoft.com
1cd40 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20  /kb/47961.      
1cd50 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
1cd60 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c  Config.xTestCall
1cd70 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70  back = va_arg(ap
1cd80 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a  , int(*)(int));.
1cd90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
1cda0 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54  ypedef int(*TEST
1cdb0 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28  CALLBACKFUNC_t)(
1cdc0 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
1cdd0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cde0 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20  xTestCallback = 
1cdf0 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43  va_arg(ap, TESTC
1ce00 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a  ALLBACKFUNC_t);.
1ce10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ce20 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20  e3FaultSim(0);. 
1ce30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ce40 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1ce50 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ce60 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41  ontrol(BENIGN_MA
1ce70 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67  LLOC_HOOKS, xBeg
1ce80 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a  in, xEnd).    **
1ce90 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72  .    ** Register
1cea0 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74   hooks to call t
1ceb0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  o indicate which
1cec0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1ced0 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62  es .    ** are b
1cee0 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  enign..    */.  
1cef0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1cf00 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
1cf10 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20  LLOC_HOOKS: {.  
1cf20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
1cf30 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e   (*void_function
1cf40 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76  )(void);.      v
1cf50 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
1cf60 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20  nignBegin;.     
1cf70 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
1cf80 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20  BenignEnd;.     
1cf90 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20   xBenignBegin = 
1cfa0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
1cfb0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
1cfc0 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61   xBenignEnd = va
1cfd0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
1cfe0 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  nction);.      s
1cff0 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c  qlite3BenignMall
1d000 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42  ocHooks(xBenignB
1d010 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64  egin, xBenignEnd
1d020 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1d030 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1d040 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1d050 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1d060 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
1d070 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65  NG_BYTE, unsigne
1d080 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  d int X).    **.
1d090 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50      ** Set the P
1d0a0 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74  ENDING byte to t
1d0b0 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
1d0c0 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30  argument, if X>0
1d0d0 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f  ..    ** Make no
1d0e0 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30   changes if X==0
1d0f0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  .  Return the va
1d100 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69  lue of the pendi
1d110 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61  ng byte.    ** a
1d120 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65  s it existing be
1d130 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1d140 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  e was called..  
1d150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f    **.    ** IMPO
1d160 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67  RTANT:  Changing
1d170 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1d180 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30  e from 0x4000000
1d190 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20  0 results in.   
1d1a0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   ** an incompati
1d1b0 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ble database fil
1d1c0 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67  e format.  Chang
1d1d0 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
1d1e0 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  byte.    ** whil
1d1f0 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63  e any database c
1d200 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
1d210 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64  n results in und
1d220 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a  efined and.    *
1d230 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65  * deleterious be
1d240 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  havior..    */. 
1d250 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1d260 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1d270 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63  BYTE: {.      rc
1d280 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
1d290 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d2a0 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b  OMIT_WSD.      {
1d2b0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1d2c0 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76  d int newVal = v
1d2d0 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
1d2e0 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ed int);.       
1d2f0 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71   if( newVal ) sq
1d300 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65  lite3PendingByte
1d310 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20   = newVal;.     
1d320 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1d330 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1d340 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1d350 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1d360 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1d370 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29  L_ASSERT, int X)
1d380 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d390 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
1d3a0 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
1d3b0 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
1d3c0 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a  er or not.    **
1d3d0 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e   assert() was en
1d3e0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
1d3f0 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20  -time.  If X is 
1d400 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28  true and assert(
1d410 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62  ).    ** is enab
1d420 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
1d430 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72  turn value is tr
1d440 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  ue.  If X is tru
1d450 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73  e and.    ** ass
1d460 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1d470 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
1d480 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
1d490 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a  .  If X is.    *
1d4a0 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  * false and asse
1d4b0 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c  rt() is enabled,
1d4c0 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74   then the assert
1d4d0 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68  ion fires and th
1d4e0 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
1d4f0 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69   aborts.  If X i
1d500 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  s false and asse
1d510 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1d520 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
1d530 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1d540 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  s zero..    */. 
1d550 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1d560 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20  ESTCTRL_ASSERT: 
1d570 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65  {.      volatile
1d580 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20   int x = 0;.    
1d590 20 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64 65    assert( /*side
1d5a0 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78  -effects-ok*/ (x
1d5b0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1d5c0 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
1d5d0 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65  c = x;.      bre
1d5e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1d5f0 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1d600 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1d610 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d620 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20  ALWAYS, int X). 
1d630 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1d640 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
1d650 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
1d660 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65  t to see how the
1d670 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20   ALWAYS and.    
1d680 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20  ** NEVER macros 
1d690 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20  were defined at 
1d6a0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20  compile-time..  
1d6b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1d6c0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1d6d0 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20  ALWAYS(X).  .   
1d6e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1d6f0 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20  ecommended test 
1d700 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65  is X==2.  If the
1d710 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1d720 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20   2, that means. 
1d730 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61     ** ALWAYS() a
1d740 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62  nd NEVER() are b
1d750 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  oth no-op pass-t
1d760 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77  hrough macros, w
1d770 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20  hich is the.    
1d780 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  ** default setti
1d790 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  ng.  If the retu
1d7a0 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74  rn value is 1, t
1d7b0 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20  hen ALWAYS() is 
1d7c0 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61  either.    ** ha
1d7d0 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
1d7e0 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65   or else it asse
1d7f0 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d  rts if its argum
1d800 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  ent is false..  
1d810 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62    ** The first b
1d820 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f  ehavior (hard-co
1d830 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20  ded to true) is 
1d840 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
1d850 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
1d860 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
1d870 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
1d880 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68   disabled and th
1d890 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
1d8a0 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74  behavior (assert
1d8b0 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
1d8c0 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20   to ALWAYS() is 
1d8d0 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61  false) is the ca
1d8e0 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
1d8f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1d900 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
1d910 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
1d920 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1d930 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74  * The run-time t
1d940 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69  est procedure mi
1d950 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69  ght look somethi
1d960 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ng like this:.  
1d970 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69    **.    **    i
1d980 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
1d990 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d9a0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
1d9b0 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20  2)==2 ){.    ** 
1d9c0 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29       // ALWAYS()
1d9d0 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
1d9e0 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1d9f0 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a  ugh macros.    *
1da00 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  *    }else if( s
1da10 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1da20 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1da30 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29  TRL_ASSERT, 1) )
1da40 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1da50 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72   ALWAYS(x) asser
1da60 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75  ts that x is tru
1da70 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65  e. NEVER(x) asse
1da80 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a  rts x is false..
1da90 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b      **    }else{
1daa0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1dab0 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63  ALWAYS(x) is a c
1dac0 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45  onstant 1.  NEVE
1dad0 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61  R(x) is a consta
1dae0 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20  nt 0..    **    
1daf0 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  }.    */.    cas
1db00 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1db10 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20  L_ALWAYS: {.    
1db20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
1db30 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1db40 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a  rc = ALWAYS(x);.
1db50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1db60 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1db70 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1db80 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1db90 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44  TESTCTRL_BYTEORD
1dba0 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ER);.    **.    
1dbb0 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 72  ** The integer r
1dbc0 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c 73 20  eturned reveals 
1dbd0 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f  the byte-order o
1dbe0 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20 6f  f the computer o
1dbf0 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 53  n which.    ** S
1dc00 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69 6e 67  QLite is running
1dc10 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1dc20 20 20 20 20 20 20 31 20 20 20 20 20 62 69 67 2d        1     big-
1dc30 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72  endian,    deter
1dc40 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  mined at run-tim
1dc50 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 31 30  e.    **      10
1dc60 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69       little-endi
1dc70 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61  an, determined a
1dc80 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
1dc90 2a 20 20 34 33 32 31 30 31 20 20 20 20 20 62 69  *  432101     bi
1dca0 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74  g-endian,    det
1dcb0 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  ermined at compi
1dcc0 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  le-time.    **  
1dcd0 31 32 33 34 31 30 20 20 20 20 20 6c 69 74 74 6c  123410     littl
1dce0 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
1dcf0 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1dd00 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20  time.    */ .   
1dd10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1dd20 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a  TCTRL_BYTEORDER:
1dd30 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
1dd40 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 2a 31  LITE_BYTEORDER*1
1dd50 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54  00 + SQLITE_LITT
1dd60 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51  LEENDIAN*10 + SQ
1dd70 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a  LITE_BIGENDIAN;.
1dd80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd90 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1dda0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1ddb0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1ddc0 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74  L_RESERVE, sqlit
1ddd0 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
1dde0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1ddf0 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 69   the nReserve si
1de00 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20  ze to N for the 
1de10 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
1de20 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1de30 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
1de40 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  db..    */.    c
1de50 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1de60 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20  TRL_RESERVE: {. 
1de70 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1de80 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
1de90 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69  lite3*);.      i
1dea0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1deb0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,int);.      sql
1dec0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1ded0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1dee0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
1def0 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61  etPageSize(db->a
1df00 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c  Db[0].pBt, 0, x,
1df10 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1df20 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1df30 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1df40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1df50 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
1df60 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1df70 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
1df80 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74  MIZATIONS, sqlit
1df90 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
1dfa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61     **.    ** Ena
1dfb0 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76  ble or disable v
1dfc0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1dfd0 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67  ions for testing
1dfe0 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20   purposes.  The 
1dff0 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  .    ** argument
1e000 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20   N is a bitmask 
1e010 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  of optimizations
1e020 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e   to be disabled.
1e030 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20    For normal.   
1e040 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20   ** operation N 
1e050 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68  should be 0.  Th
1e060 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 61  e idea is that a
1e070 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c   test program (l
1e080 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  ike the.    ** S
1e090 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72  QL Logic Test or
1e0a0 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65   SLT test module
1e0b0 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61  ) can run the sa
1e0c0 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20  me SQL multiple 
1e0d0 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74  times.    ** wit
1e0e0 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  h various optimi
1e0f0 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64  zations disabled
1e100 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1e110 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
1e120 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e      ** is obtain
1e130 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73 65  ed in every case
1e140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e150 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e160 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a  L_OPTIMIZATIONS:
1e170 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e180 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1e190 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1e1a0 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67     db->dbOptFlag
1e1b0 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72 67  s = (u16)(va_arg
1e1c0 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66 66  (ap, int) & 0xff
1e1d0 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ff);.      break
1e1e0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
1e1f0 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
1e200 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1e210 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1e220 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
1e230 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68  EYWORD, const ch
1e240 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a  ar *zWord).    *
1e250 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72  *.    ** If zWor
1e260 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72  d is a keyword r
1e270 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65  ecognized by the
1e280 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65   parser, then re
1e290 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  turn the.    ** 
1e2a0 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72  number of keywor
1e2b0 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64  ds.  Or if zWord
1e2c0 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72   is not a keywor
1e2d0 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20  d, return 0..   
1e2e0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73   ** .    ** This
1e2f0 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69 73   test feature is
1e300 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1e310 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  in the amalgamat
1e320 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a  ion since.    **
1e330 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45   the SQLITE_N_KE
1e340 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e  YWORD macro is n
1e350 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ot defined in th
1e360 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74  is file if SQLit
1e370 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c  e.    ** is buil
1e380 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  t using separate
1e390 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20   source files.. 
1e3a0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e3b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1e3c0 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20  SKEYWORD: {.    
1e3d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
1e3e0 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ord = va_arg(ap,
1e3f0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20   const char*);. 
1e400 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
1e410 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f  ite3Strlen30(zWo
1e420 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rd);.      rc = 
1e430 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43  (sqlite3KeywordC
1e440 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20  ode((u8*)zWord, 
1e450 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c  n)!=TK_ID) ? SQL
1e460 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20  ITE_N_KEYWORD : 
1e470 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1e480 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20      }.#endif .. 
1e490 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
1e4a0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1e4b0 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
1e4c0 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70  CHMALLOC, sz, &p
1e4d0 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  New, pFree);.   
1e4e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20   **.    ** Pass 
1e4f0 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74  pFree into sqlit
1e500 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29 2e  e3ScratchFree().
1e510 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30   .    ** If sz>0
1e520 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
1e530 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20   scratch buffer 
1e540 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20  into pNew.  .   
1e550 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e560 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
1e570 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  ATCHMALLOC: {.  
1e580 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c      void *pFree,
1e590 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20   **ppNew;.      
1e5a0 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a  int sz;.      sz
1e5b0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1e5c0 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20  t);.      ppNew 
1e5d0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1e5e0 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65  d**);.      pFre
1e5f0 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
1e600 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28  oid*);.      if(
1e610 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73   sz ) *ppNew = s
1e620 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
1e630 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73  loc(sz);.      s
1e640 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
1e650 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
1e660 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e670 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1e680 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1e690 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
1e6a0 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74  LTIME_FAULT, int
1e6b0 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
1e6c0 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
1e6d0 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
1e6e0 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65  -zero, configure
1e6f0 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73 6f   the wrappers so
1e700 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a   that all.    **
1e710 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
1e720 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29  s to localtime()
1e730 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61   and variants fa
1e740 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
1e750 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64  zero,.    ** und
1e760 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a  o this setting..
1e770 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e780 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e790 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
1e7a0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e7b0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f  GlobalConfig.bLo
1e7c0 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76  caltimeFault = v
1e7d0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1e7e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e7f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1e800 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e810 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e820 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
1e830 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   int);.    **.  
1e840 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61    ** Set or clea
1e850 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  r a flag that in
1e860 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1e870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1e880 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20  s always well-. 
1e890 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64     ** formed and
1e8a0 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20   never corrupt. 
1e8b0 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c   This flag is cl
1e8c0 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20  ear by default, 
1e8d0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a  indicating that.
1e8e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1e8f0 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65  files might have
1e900 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75   arbitrary corru
1e910 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20  ption.  Setting 
1e920 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a  the flag during.
1e930 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63      ** testing c
1e940 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73  auses certain as
1e950 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1e960 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f  s in the code to
1e970 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20   be activated.  
1e980 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73    ** that demons
1e990 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20  trat invariants 
1e9a0 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  on well-formed d
1e9b0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20  atabase files.. 
1e9c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e9d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1e9e0 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a  EVER_CORRUPT: {.
1e9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1ea00 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43  balConfig.neverC
1ea10 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28  orrupt = va_arg(
1ea20 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1ea30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ea40 20 20 2f 2a 20 53 65 74 20 74 68 65 20 74 68 72    /* Set the thr
1ea50 65 73 68 6f 6c 64 20 61 74 20 77 68 69 63 68 20  eshold at which 
1ea60 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e 74 65 72 73  OP_Once counters
1ea70 20 72 65 73 65 74 20 62 61 63 6b 20 74 6f 20 7a   reset back to z
1ea80 65 72 6f 2e 0a 20 20 20 20 2a 2a 20 42 79 20 64  ero..    ** By d
1ea90 65 66 61 75 6c 74 20 74 68 69 73 20 69 73 20 30  efault this is 0
1eaa0 78 37 66 66 66 66 66 66 65 20 28 6f 76 65 72 20  x7ffffffe (over 
1eab0 32 20 62 69 6c 6c 69 6f 6e 29 2c 20 62 75 74 20  2 billion), but 
1eac0 74 68 61 74 20 76 61 6c 75 65 20 69 73 0a 20 20  that value is.  
1ead0 20 20 2a 2a 20 74 6f 6f 20 62 69 67 20 74 6f 20    ** too big to 
1eae0 74 65 73 74 20 69 6e 20 61 20 72 65 61 73 6f 6e  test in a reason
1eaf0 61 62 6c 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74  able amount of t
1eb00 69 6d 65 2c 20 73 6f 20 74 68 69 73 20 63 6f 6e  ime, so this con
1eb10 74 72 6f 6c 20 69 73 0a 20 20 20 20 2a 2a 20 70  trol is.    ** p
1eb20 72 6f 76 69 64 65 64 20 74 6f 20 73 65 74 20 61  rovided to set a
1eb30 20 73 6d 61 6c 6c 20 61 6e 64 20 65 61 73 69 6c   small and easil
1eb40 79 20 72 65 61 63 68 61 62 6c 65 20 72 65 73 65  y reachable rese
1eb50 74 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a  t value..    */.
1eb60 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1eb70 54 45 53 54 43 54 52 4c 5f 4f 4e 43 45 5f 52 45  TESTCTRL_ONCE_RE
1eb80 53 45 54 5f 54 48 52 45 53 48 4f 4c 44 3a 20 7b  SET_THRESHOLD: {
1eb90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1eba0 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63 65  obalConfig.iOnce
1ebb0 52 65 73 65 74 54 68 72 65 73 68 6f 6c 64 20 3d  ResetThreshold =
1ebc0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1ebd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ebe0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1ebf0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1ec00 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1ec10 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  TRL_VDBE_COVERAG
1ec20 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74  E, xCallback, pt
1ec30 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  r);.    **.    *
1ec40 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20 63  * Set the VDBE c
1ec50 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b  overage callback
1ec60 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61   function to xCa
1ec70 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74  llback with cont
1ec80 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ext .    ** poin
1ec90 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a  ter ptr..    */.
1eca0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ecb0 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1ecc0 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66  VERAGE: {.#ifdef
1ecd0 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
1ece0 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70 65  ERAGE.      type
1ecf0 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63  def void (*branc
1ed00 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  h_callback)(void
1ed10 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20  *,int,u8,u8);.  
1ed20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1ed30 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61  lConfig.xVdbeBra
1ed40 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  nch = va_arg(ap,
1ed50 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1ed60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1ed70 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1ed80 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f  eBranchArg = va_
1ed90 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23  arg(ap,void*);.#
1eda0 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
1edb0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1edc0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1edd0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1ede0 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
1edf0 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20  MAP, db, nMax); 
1ee00 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ee10 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
1ee20 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20  ER_MMAP: {.     
1ee30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1ee40 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1ee50 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  3*);.      db->n
1ee60 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
1ee70 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1ee80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ee90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1eea0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1eeb0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1eec0 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20 20  RL_ISINIT);.    
1eed0 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e  **.    ** Return
1eee0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51   SQLITE_OK if SQ
1eef0 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69 6e  Lite has been in
1ef00 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53 51  itialized and SQ
1ef10 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20 20  LITE_ERROR if.  
1ef20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f    ** not..    */
1ef30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ef40 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
1ef50 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
1ef60 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ef70 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72 63  g.isInit==0 ) rc
1ef80 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1ef90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1efa0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1efb0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1efc0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1efd0 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20  L_IMPOSTER, db, 
1efe0 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74  dbName, onOff, t
1eff0 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  num);.    **.   
1f000 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f   ** This test co
1f010 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74 6f  ntrol is used to
1f020 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72   create imposter
1f030 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20 69   tables.  "db" i
1f040 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  s a pointer.    
1f050 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
1f060 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  se connection.  
1f070 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64 61  dbName is the da
1f080 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78 3a  tabase name (ex:
1f090 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a   "main" or.    *
1f0a0 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63 68 20  * "temp") which 
1f0b0 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68 65  will receive the
1f0c0 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f   imposter.  "onO
1f0d0 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73 74  ff" turns impost
1f0e0 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a  er mode on.    *
1f0f0 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d  * or off.  "tnum
1f100 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  " is the root pa
1f110 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
1f120 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6d   to which the im
1f130 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  poster.    ** ta
1f140 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65  ble should conne
1f150 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ct..    **.    *
1f160 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65  * Enable imposte
1f170 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e  r mode only when
1f180 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
1f190 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61 72  already been par
1f1a0 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a  sed.  Then.    *
1f1b0 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 43  * run a single C
1f1c0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1f1d0 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75  ement to constru
1f1e0 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20  ct the imposter 
1f1f0 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20  table in.    ** 
1f200 74 68 65 20 70 61 72 73 65 64 20 73 63 68 65 6d  the parsed schem
1f210 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69 6d  a.  Then turn im
1f220 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63 6b  poster mode back
1f230 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20 20   off again..    
1f240 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f  **.    ** If onO
1f250 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30  ff==0 and tnum>0
1f260 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
1f270 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64  schema for all d
1f280 61 74 61 62 61 73 65 73 2c 20 63 61 75 73 69 6e  atabases, causin
1f290 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  g.    ** the sch
1f2a0 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72 73  ema to be repars
1f2b0 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
1f2c0 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20 20   it is needed.  
1f2d0 54 68 69 73 20 68 61 73 20 74 68 65 0a 20 20 20  This has the.   
1f2e0 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65 72   ** effect of er
1f2f0 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74  asing all impost
1f300 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a  er tables..    *
1f310 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1f320 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
1f330 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
1f340 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1f350 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1f360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1f370 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1f380 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62 2d  utex);.      db-
1f390 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c 69  >init.iDb = sqli
1f3a0 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
1f3b0 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73  , va_arg(ap,cons
1f3c0 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
1f3d0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
1f3e0 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74   db->init.impost
1f3f0 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72 67  erTable = va_arg
1f400 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1f410 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1f420 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1f430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
1f440 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26  >init.busy==0 &&
1f450 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1f460 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  m>0 ){.        s
1f470 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
1f480 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
1f490 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n(db);.      }. 
1f4a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1f4b0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1f4c0 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
1f4d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
1f4e0 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
1f4f0 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 54 45 53   /* SQLITE_UNTES
1f500 54 41 42 4c 45 20 2a 2f 0a 20 20 72 65 74 75 72  TABLE */.  retur
1f510 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f520 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
1f530 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
1f540 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
1f550 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
1f560 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
1f570 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
1f580 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
1f590 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
1f5a0 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
1f5b0 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
1f5c0 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
1f5d0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
1f5e0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1f5f0 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
1f600 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
1f610 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
1f620 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
1f630 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
1f640 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
1f650 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
1f660 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
1f670 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
1f680 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
1f690 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
1f6a0 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
1f6b0 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1f6c0 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
1f6d0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
1f6e0 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
1f6f0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
1f700 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
1f710 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1f720 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
1f730 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
1f740 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
1f750 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
1f760 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1f770 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1f780 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
1f790 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61  lename==0 || zPa
1f7a0 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ram==0 ) return 
1f7b0 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  0;.  zFilename +
1f7c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1f7d0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1f7e0 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65  ;.  while( zFile
1f7f0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
1f800 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46  nt x = strcmp(zF
1f810 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
1f820 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
1f830 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
1f840 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
1f850 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20  1;.    if( x==0 
1f860 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61  ) return zFilena
1f870 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  me;.    zFilenam
1f880 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
1f890 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
1f8a0 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  + 1;.  }.  retur
1f8b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
1f8c0 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76  turn a boolean v
1f8d0 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79  alue for a query
1f8e0 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69   parameter..*/.i
1f8f0 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  nt sqlite3_uri_b
1f900 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61  oolean(const cha
1f910 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1f920 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1f930 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20  , int bDflt){.  
1f940 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1f950 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1f960 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
1f970 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c   zParam);.  bDfl
1f980 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20  t = bDflt!=0;.  
1f990 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74  return z ? sqlit
1f9a0 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20  e3GetBoolean(z, 
1f9b0 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a  bDflt) : bDflt;.
1f9c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f9d0 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
1f9e0 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
1f9f0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
1fa00 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1fa10 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34  qlite3_uri_int64
1fa20 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1fa30 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a  zFilename,    /*
1fa40 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73   Filename as pas
1fa50 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a  sed to xOpen */.
1fa60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1fa70 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55  aram,       /* U
1fa80 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75  RI parameter sou
1fa90 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ght */.  sqlite3
1faa0 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20  _int64 bDflt    
1fab0 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20     /* return if 
1fac0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73  parameter is mis
1fad0 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  sing */.){.  con
1fae0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1faf0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1fb00 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
1fb10 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  aram);.  sqlite3
1fb20 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20  _int64 v;.  if( 
1fb30 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f  z && sqlite3DecO
1fb40 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29  rHexToI64(z, &v)
1fb50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fb60 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20     bDflt = v;.  
1fb70 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74  }.  return bDflt
1fb80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1fb90 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e  n the Btree poin
1fba0 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
1fbb0 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75  y zDbName.  Retu
1fbc0 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1fbd0 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a  ound..*/.Btree *
1fbe0 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1fbf0 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  tree(sqlite3 *db
1fc00 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1fc10 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 44  bName){.  int iD
1fc20 62 20 3d 20 7a 44 62 4e 61 6d 65 20 3f 20 73 71  b = zDbName ? sq
1fc30 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
1fc40 64 62 2c 20 7a 44 62 4e 61 6d 65 29 20 3a 20 30  db, zDbName) : 0
1fc50 3b 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3c 30  ;.  return iDb<0
1fc60 20 3f 20 30 20 3a 20 64 62 2d 3e 61 44 62 5b 69   ? 0 : db->aDb[i
1fc70 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Db].pBt;.}../*.*
1fc80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
1fc90 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  ename of the dat
1fca0 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
1fcb0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
1fcc0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
1fcd0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1fce0 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
1fcf0 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
1fd00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1fd10 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  ame){.  Btree *p
1fd20 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Bt;.#ifdef SQLIT
1fd30 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1fd40 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1fd50 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1fd60 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
1fd70 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1fd80 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
1fd90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
1fda0 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  Bt = sqlite3DbNa
1fdb0 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1fdc0 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  bName);.  return
1fdd0 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74   pBt ? sqlite3Bt
1fde0 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70  reeGetFilename(p
1fdf0 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Bt) : 0;.}../*.*
1fe00 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64 61  * Return 1 if da
1fe10 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f  tabase is read-o
1fe20 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61 64  nly or 0 if read
1fe30 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20  /write.  Return 
1fe40 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  -1 if.** no such
1fe50 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73   database exists
1fe60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fe70 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c  _db_readonly(sql
1fe80 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1fe90 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1fea0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
1feb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1fec0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1fed0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1fee0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1fef0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1ff00 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1ff10 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
1ff20 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20  .#endif.  pBt = 
1ff30 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1ff40 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1ff50 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
1ff60 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ? sqlite3BtreeIs
1ff70 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20  Readonly(pBt) : 
1ff80 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  -1;.}..#ifdef SQ
1ff90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
1ffa0 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  SHOT./*.** Obtai
1ffb0 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e  n a snapshot han
1ffc0 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61 70  dle for the snap
1ffd0 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73 65  shot of database
1ffe0 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20 0a   zDb currently .
1fff0 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62 79  ** being read by
20000 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
20010 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  nt sqlite3_snaps
20020 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69 74  hot_get(.  sqlit
20030 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
20040 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71   char *zDb,.  sq
20050 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
20060 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20  *ppSnapshot.){. 
20070 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20080 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20  _ERROR;.#ifndef 
20090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
200a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
200b0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
200c0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
200d0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
200e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
200f0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
20100 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
20110 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
20120 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
20130 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
20140 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mmit==0 ){.    i
20150 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
20160 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
20170 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
20180 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a  ==0 || iDb>1 ){.
20190 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
201a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
201b0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 30  pBt;.      if( 0
201c0 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ==sqlite3BtreeIs
201d0 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
201e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
201f0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
20200 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  ans(pBt, 0);.   
20210 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20230 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20240 50 61 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74  PagerSnapshotGet
20250 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
20260 65 72 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73  er(pBt), ppSnaps
20270 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hot);.        }.
20280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20290 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
202a0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
202b0 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a  ex);.#endif   /*
202c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
202d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
202e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
202f0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
20300 6e 20 6f 6e 20 74 68 65 20 73 6e 61 70 73 68 6f  n on the snapsho
20310 74 20 69 64 65 6e 64 69 66 69 65 64 20 62 79 20  t idendified by 
20320 70 53 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e  pSnapshot..*/.in
20330 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  t sqlite3_snapsh
20340 6f 74 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74  ot_open(.  sqlit
20350 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
20360 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73   char *zDb, .  s
20370 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
20380 2a 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20  *pSnapshot.){.  
20390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
203a0 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53  ERROR;.#ifndef S
203b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
203c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
203d0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
203e0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
203f0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
20400 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
20410 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
20420 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
20430 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20440 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
20450 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
20460 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  it==0 ){.    int
20470 20 69 44 62 3b 0a 20 20 20 20 69 44 62 20 3d 20   iDb;.    iDb = 
20480 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
20490 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  e(db, zDb);.    
204a0 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44  if( iDb==0 || iD
204b0 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72  b>1 ){.      Btr
204c0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
204d0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
204e0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
204f0 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61  BtreeIsInReadTra
20500 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
20510 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20520 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e  agerSnapshotOpen
20530 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
20540 65 72 28 70 42 74 29 2c 20 70 53 6e 61 70 73 68  er(pBt), pSnapsh
20550 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ot);.        if(
20560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20570 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20580 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
20590 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b  inTrans(pBt, 0);
205a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
205b0 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
205c0 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65  pen(sqlite3Btree
205d0 50 61 67 65 72 28 70 42 74 29 2c 20 30 29 3b 0a  Pager(pBt), 0);.
205e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
205f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
20600 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
20610 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
20620 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
20630 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
20640 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20650 0a 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20 6d  .** Recover as m
20660 61 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61 73  any snapshots as
20670 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
20680 68 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73 6f  he wal file asso
20690 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 73  ciated with.** s
206a0 63 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61 74  chema zDb of dat
206b0 61 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  abase db..*/.int
206c0 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
206d0 74 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74 65  t_recover(sqlite
206e0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
206f0 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72  r *zDb){.  int r
20700 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
20710 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69 66  ;.  int iDb;.#if
20720 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20730 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c  _WAL..#ifdef SQL
20740 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
20750 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
20760 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
20770 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
20780 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
20790 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
207a0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f..  sqlite3_mut
207b0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
207c0 65 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ex);.  iDb = sql
207d0 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
207e0 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69  b, zDb);.  if( i
207f0 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29  Db==0 || iDb>1 )
20800 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
20810 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
20820 70 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  pBt;.    if( 0==
20830 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
20840 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29  ReadTrans(pBt) )
20850 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20860 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
20870 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  ans(pBt, 0);.   
20880 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
208a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
208b0 72 53 6e 61 70 73 68 6f 74 52 65 63 6f 76 65 72  rSnapshotRecover
208c0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
208d0 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
208e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
208f0 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
20900 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
20910 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
20920 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
20930 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
20940 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
20950 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20960 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e 61 70 73  .** Free a snaps
20970 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74 61 69  hot handle obtai
20980 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
20990 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 29 2e  _snapshot_get().
209a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
209b0 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 73  _snapshot_free(s
209c0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
209d0 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73  *pSnapshot){.  s
209e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6e 61  qlite3_free(pSna
209f0 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pshot);.}.#endif
20a00 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
20a10 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a        E_SNAPSHOT */.