/ Hex Artifact Content
Login

Artifact 8dc7adfeace35ee1f4c489b503ee8fe6bc1fa802:


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 4c 4f 4f 4b 41 53 49 44  BCONFIG_LOOKASID
6c10: 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  E: {.      void 
6c20: 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61  *pBuf = va_arg(a
6c30: 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d  p, void*); /* IM
6c40: 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34  P: R-26835-10964
6c50: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
6c60: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6c70: 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50  t);       /* IMP
6c80: 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20  : R-47871-25994 
6c90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
6ca0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6cb0: 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  t);      /* IMP:
6cc0: 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a   R-04460-53386 *
6cd0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74  /.      rc = set
6ce0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
6cf0: 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a  pBuf, sz, cnt);.
6d00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d10: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6d20: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
6d30: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
6d40: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
6d50: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6d60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
6d70: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b  mask;    /* Mask
6d80: 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73   of the bit in s
6d90: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20  qlite3.flags to 
6da0: 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20  set/clear */.   
6db0: 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d     } aFlagOp[] =
6dc0: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c   {.        { SQL
6dd0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
6de0: 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 20 20 20  BLE_FKEY,       
6df0: 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69      SQLITE_Forei
6e00: 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20  gnKeys    },.   
6e10: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
6e20: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
6e30: 49 47 47 45 52 2c 20 20 20 20 20 20 20 20 53 51  IGGER,        SQ
6e40: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
6e50: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  er  },.        {
6e60: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
6e70: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
6e80: 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46  ENIZER, SQLITE_F
6e90: 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c  ts3Tokenizer  },
6ea0: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6eb0: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6ec0: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
6ed0: 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  , SQLITE_LoadExt
6ee0: 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  ension  },.     
6ef0: 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   };.      unsign
6f00: 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20  ed int i;.      
6f10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
6f20: 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37  R; /* IMP: R-427
6f30: 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20  90-23372 */.    
6f40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
6f50: 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b  aySize(aFlagOp);
6f60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
6f70: 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70  f( aFlagOp[i].op
6f80: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ==op ){.        
6f90: 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61    int onoff = va
6fa0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
6fb0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52           int *pR
6fc0: 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  es = va_arg(ap, 
6fd0: 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20  int*);.         
6fe0: 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20   int oldFlags = 
6ff0: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  db->flags;.     
7000: 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30       if( onoff>0
7010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7020: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c  db->flags |= aFl
7030: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
7040: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7050: 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20  ( onoff==0 ){.  
7060: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
7070: 61 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b  ags &= ~aFlagOp[
7080: 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  i].mask;.       
7090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
70a0: 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d  f( oldFlags!=db-
70b0: 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  >flags ){.      
70c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
70d0: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
70e0: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  ments(db);.     
70f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7100: 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20   if( pRes ){.   
7110: 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
7120: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46   (db->flags & aF
7130: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d  lagOp[i].mask)!=
7140: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
7150: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
7160: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
7170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7180: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
71a0: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
71b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
71c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
71d0: 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65  rue if the buffe
71e0: 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74  r z[0..n-1] cont
71f0: 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e  ains all spaces.
7200: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
7210: 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63  llSpaces(const c
7220: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
7230: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
7240: 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e  z[n-1]==' ' ){ n
7250: 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  --; }.  return n
7260: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
7270: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
7280: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
7290: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
72a0: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
72b0: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
72c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
72d0: 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  adFlag argument 
72e0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
72f0: 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61   space padding a
7300: 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  t the end.** of 
7310: 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72  strings is ignor
7320: 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ed.  This implem
7330: 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63  ents the RTRIM c
7340: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ollation..*/.sta
7350: 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46  tic int binCollF
7360: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64  unc(.  void *pad
7370: 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Flag,.  int nKey
7380: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7390: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
73a0: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
73b0: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
73c0: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
73d0: 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
73e0: 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49   nKey2;.  /* EVI
73f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33  DENCE-OF: R-6503
7400: 33 2d 32 38 34 34 39 20 54 68 65 20 62 75 69 6c  3-28449 The buil
7410: 74 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c  t-in BINARY coll
7420: 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20  ation compares. 
7430: 20 2a 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65   ** strings byte
7440: 20 62 79 20 62 79 74 65 20 75 73 69 6e 67 20 74   by byte using t
7450: 68 65 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63  he memcmp() func
7460: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74  tion from the st
7470: 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69  andard C.  ** li
7480: 62 72 61 72 79 2e 20 2a 2f 0a 20 20 72 63 20 3d  brary. */.  rc =
7490: 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
74a0: 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
74b0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
74c0: 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26   padFlag.     &&
74d0: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
74e0: 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65  r*)pKey1)+n, nKe
74f0: 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c  y1-n).     && al
7500: 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29  lSpaces(((char*)
7510: 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d  pKey2)+n, nKey2-
7520: 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
7530: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7540: 52 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52 54  R-31624-24737 RT
7550: 52 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e 41  RIM is like BINA
7560: 52 59 20 65 78 63 65 70 74 20 74 68 61 74 20 65  RY except that e
7570: 78 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73 70  xtra.      ** sp
7580: 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 20  aces at the end 
7590: 6f 66 20 65 69 74 68 65 72 20 73 74 72 69 6e 67  of either string
75a0: 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
75b0: 68 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74  he result. In ot
75c0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72  her.      ** wor
75d0: 64 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c 6c  ds, strings will
75e0: 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
75f0: 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61 73  o one another as
7600: 20 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20 20   long as they.  
7610: 20 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e      ** differ on
7620: 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ly in the number
7630: 20 6f 66 20 73 70 61 63 65 73 20 61 74 20 74 68   of spaces at th
7640: 65 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  e end..      */.
7650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7660: 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b   rc = nKey1 - nK
7670: 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ey2;.    }.  }. 
7680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7690: 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69  *.** Another bui
76a0: 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20  lt-in collating 
76b0: 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45  sequence: NOCASE
76c0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  . .**.** This co
76d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
76e0: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
76f0: 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73  be used for "cas
7700: 65 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a  e independent.**
7710: 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51   comparison". SQ
7720: 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65  Lite's knowledge
7730: 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   of upper and lo
7740: 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c  wer case equival
7750: 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20  ents.** extends 
7760: 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63  only to the 26 c
7770: 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69  haracters used i
7780: 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61  n the English la
7790: 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74  nguage..**.** At
77a0: 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72   the moment ther
77b0: 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d  e is only a UTF-
77c0: 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  8 implementation
77d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
77e0: 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
77f0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
7800: 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
7810: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7820: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
7830: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
7840: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20  Key2.){.  int r 
7850: 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  = sqlite3StrNICm
7860: 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20  p(.      (const 
7870: 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63  char *)pKey1, (c
7880: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79  onst char *)pKey
7890: 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29  2, (nKey1<nKey2)
78a0: 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20  ?nKey1:nKey2);. 
78b0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
78c0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  R(NotUsed);.  if
78d0: 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20  ( 0==r ){.    r 
78e0: 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20  = nKey1-nKey2;. 
78f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
7900: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7910: 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  he ROWID of the 
7920: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
7930: 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74  rt.*/.sqlite_int
7940: 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  64 sqlite3_last_
7950: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c  insert_rowid(sql
7960: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
7970: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7980: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7990: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
79a0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
79b0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
79c0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
79d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
79e0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
79f0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  >lastRowid;.}../
7a00: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7a10: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
7a20: 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  s in the most re
7a30: 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
7a40: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a  ite3_exec()..*/.
7a50: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  int sqlite3_chan
7a60: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
7a70: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
7a80: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
7a90: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
7aa0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
7ab0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
7ac0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
7ad0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7ae0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
7af0: 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b  urn db->nChange;
7b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7b10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
7b20: 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65  hanges since the
7b30: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7b40: 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a   was opened..*/.
7b50: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  int sqlite3_tota
7b60: 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  l_changes(sqlite
7b70: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7b80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
7b90: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
7ba0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
7bb0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
7bc0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
7bd0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
7be0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7bf0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54  .  return db->nT
7c00: 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  otalChange;.}../
7c10: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f  *.** Close all o
7c20: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
7c30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  This function on
7c40: 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66  ly manipulates f
7c50: 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20  ields of the.** 
7c60: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7c70: 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20  object, it does 
7c80: 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61  not close any sa
7c90: 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61  vepoints that ma
7ca0: 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20  y be open.** at 
7cb0: 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72  the b-tree/pager
7cc0: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20   level..*/.void 
7cd0: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
7ce0: 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  points(sqlite3 *
7cf0: 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62  db){.  while( db
7d00: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->pSavepoint ){.
7d10: 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70      Savepoint *p
7d20: 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  Tmp = db->pSavep
7d30: 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53  oint;.    db->pS
7d40: 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d  avepoint = pTmp-
7d50: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
7d60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
7d70: 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e  mp);.  }.  db->n
7d80: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
7d90: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
7da0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61  = 0;.  db->isTra
7db0: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
7dc0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
7dd0: 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  Invoke the destr
7de0: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61  uctor function a
7df0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46  ssociated with F
7e00: 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79  uncDef p, if any
7e10: 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20  . Except,.** if 
7e20: 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
7e30: 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65  last copy of the
7e40: 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f   function, do no
7e50: 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c  t invoke it. Mul
7e60: 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20  tiple.** copies 
7e70: 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63  of a single func
7e80: 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64  tion are created
7e90: 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e   when create_fun
7ea0: 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65  ction() is calle
7eb0: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
7ec0: 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f  _ANY as the enco
7ed0: 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ding..*/.static 
7ee0: 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73  void functionDes
7ef0: 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62  troy(sqlite3 *db
7f00: 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20  , FuncDef *p){. 
7f10: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
7f20: 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  *pDestructor = p
7f30: 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 3b  ->u.pDestructor;
7f40: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
7f50: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
7f60: 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  uctor->nRef--;. 
7f70: 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74     if( pDestruct
7f80: 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  or->nRef==0 ){. 
7f90: 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72       pDestructor
7fa0: 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74  ->xDestroy(pDest
7fb0: 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74  ructor->pUserDat
7fc0: 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
7fd0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73  3DbFree(db, pDes
7fe0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
7ff0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73    }.}../*.** Dis
8000: 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69  connect all sqli
8010: 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73  te3_vtab objects
8020: 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
8030: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8040: 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20  ion.** db. This 
8050: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64  is called when d
8060: 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65  b is being close
8070: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8080: 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  d disconnectAllV
8090: 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tab(sqlite3 *db)
80a0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
80b0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
80c0: 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61  LE.  int i;.  Ha
80d0: 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c  shElem *p;.  sql
80e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
80f0: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
8100: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
8110: 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ){.    Schema *p
8120: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
8130: 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [i].pSchema;.   
8140: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
8150: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
8160: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
8170: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
8180: 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d  >tblHash); p; p=
8190: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
81a0: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
81b0: 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65  e *pTab = (Table
81c0: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
81d0: 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  a(p);.        if
81e0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
81f0: 29 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44  ) ) sqlite3VtabD
8200: 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54  isconnect(db, pT
8210: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
8220: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73   }.  }.  for(p=s
8230: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
8240: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b  db->aModule); p;
8250: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
8260: 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(p)){.    Modul
8270: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
8280: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
8290: 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(p);.    if( p
82a0: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a  Mod->pEpoTab ){.
82b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
82c0: 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  bDisconnect(db, 
82d0: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a  pMod->pEpoTab);.
82e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
82f0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
8300: 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  t(db);.  sqlite3
8310: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
8320: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
8330: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
8340: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
8350: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
8360: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8370: 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e  ion db has unfin
8380: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
8390: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
83a0: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
83b0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
83c0: 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ts.  .*/.static 
83d0: 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73  int connectionIs
83e0: 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62  Busy(sqlite3 *db
83f0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
8400: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8410: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
8420: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ex) );.  if( db-
8430: 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20  >pVdbe ) return 
8440: 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  1;.  for(j=0; j<
8450: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
8460: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8470: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a  db->aDb[j].pBt;.
8480: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
8490: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42  qlite3BtreeIsInB
84a0: 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74  ackup(pBt) ) ret
84b0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
84c0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
84d0: 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Close an existin
84e0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
84f0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
8500: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c  sqlite3Close(sql
8510: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f  ite3 *db, int fo
8520: 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66  rceZombie){.  if
8530: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20  ( !db ){.    /* 
8540: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
8550: 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c 69  3257-11740 Calli
8560: 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  ng sqlite3_close
8570: 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  () or.    ** sql
8580: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20  ite3_close_v2() 
8590: 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  with a NULL poin
85a0: 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ter argument is 
85b0: 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
85c0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
85d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
85e0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
85f0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
8600: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
8610: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
8620: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
8630: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8640: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
8650: 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 20  f( db->mTrace & 
8660: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
8670: 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54  SE ){.    db->xT
8680: 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43  race(SQLITE_TRAC
8690: 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72  E_CLOSE, db->pTr
86a0: 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a  aceArg, db, 0);.
86b0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20    }..  /* Force 
86c0: 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c  xDisconnect call
86d0: 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c  s on all virtual
86e0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73   tables */.  dis
86f0: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64  connectAllVtab(d
8700: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  b);..  /* If a t
8710: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
8720: 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65  en, the disconne
8730: 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c  ctAllVtab() call
8740: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
8750: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
8760: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
8770: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
8780: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
8790: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
87a0: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
87b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
87c0: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
87d0: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
87e0: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
87f0: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
8800: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
8810: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
8820: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
8830: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
8840: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
8850: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
8860: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
8870: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
8880: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
8890: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
88a0: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
88b0: 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f  * Legacy behavio
88c0: 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  r (sqlite3_close
88d0: 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20  () behavior) is 
88e0: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
88f0: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68  QLITE_BUSY if th
8900: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
8910: 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69   not be closed i
8920: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
8930: 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d  .  if( !forceZom
8940: 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f  bie && connectio
8950: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
8960: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
8970: 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
8980: 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20  E_BUSY, "unable 
8990: 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20  to close due to 
89a0: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20  unfinalized ".  
89b0: 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73       "statements
89c0: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62   or unfinished b
89d0: 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71  ackups");.    sq
89e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
89f0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8a00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8a10: 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  BUSY;.  }..#ifde
8a20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8a30: 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
8a40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
8a50: 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
8a60: 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68  /* Closing the h
8a70: 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
8a80: 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
8a90: 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a  d the value 2. *
8aa0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  /.    sqlite3Glo
8ab0: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
8ac0: 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g(sqlite3GlobalC
8ad0: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
8ae0: 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d  , db, 0, 2);.  }
8af0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
8b00: 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63  nvert the connec
8b10: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62  tion into a zomb
8b20: 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73  ie and then clos
8b30: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d  e it..  */.  db-
8b40: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
8b50: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20  MAGIC_ZOMBIE;.  
8b60: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
8b70: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
8b80: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
8b90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8ba0: 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73  * Two variations
8bb0: 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69   on the public i
8bc0: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f  nterface for clo
8bd0: 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  sing a database.
8be0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  ** connection. T
8bf0: 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  he sqlite3_close
8c00: 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72  () version retur
8c10: 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ns SQLITE_BUSY a
8c20: 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65  nd.** leaves the
8c30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69   connection opti
8c40: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
8c50: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70  unfinalized prep
8c60: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
8c70: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
8c80: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73   sqlite3_backups
8c90: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  .  The sqlite3_c
8ca0: 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72  lose_v2().** ver
8cb0: 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20  sion forces the 
8cc0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
8cd0: 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66  come a zombie if
8ce0: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e   there are.** un
8cf0: 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73  closed resources
8d00: 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66  , and arranges f
8d10: 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  or deallocation 
8d20: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a  when the last.**
8d30: 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
8d40: 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  nt or sqlite3_ba
8d50: 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a  ckup closes..*/.
8d60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
8d70: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  e(sqlite3 *db){ 
8d80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
8d90: 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74  ose(db,0); }.int
8da0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
8db0: 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  2(sqlite3 *db){ 
8dc0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
8dd0: 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f  ose(db,1); }.../
8de0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d  *.** Close the m
8df0: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
8e00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
8e10: 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  **.** Furthermor
8e20: 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63  e, if database c
8e30: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
8e40: 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e  a zombie (meanin
8e50: 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  g that there.** 
8e60: 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72  has been a prior
8e70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8e80: 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71  _close(db) or sq
8e90: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64  lite3_close_v2(d
8ea0: 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79  b)) and.** every
8eb0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61   sqlite3_stmt ha
8ec0: 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c  s now been final
8ed0: 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73  ized and every s
8ee0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61  qlite3_backup ha
8ef0: 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74  s.** finished, t
8f00: 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73  hen free all res
8f10: 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ources..*/.void 
8f20: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
8f30: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
8f40: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8f50: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20  HashElem *i;    
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74  /* Hash table it
8f80: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
8f90: 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  j;..  /* If ther
8fa0: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
8fb0: 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  g sqlite3_stmt o
8fc0: 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  r sqlite3_backup
8fd0: 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72   objects.  ** or
8fe0: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
8ff0: 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  on has not yet b
9000: 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71  een closed by sq
9010: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
9020: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74  ,.  ** then just
9030: 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78   leave the mutex
9040: 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
9050: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  /.  if( db->magi
9060: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
9070: 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63  ZOMBIE || connec
9080: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
9090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
90a0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
90b0: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
90c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
90d0: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
90e0: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
90f0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
9100: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20  onnection has.  
9110: 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71  ** closed all sq
9120: 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73  lite3_stmt and s
9130: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
9140: 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65  jects and has be
9150: 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74  en.  ** passed t
9160: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20  o sqlite3_close 
9170: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74  (meaning that it
9180: 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20   is a zombie).  
9190: 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20  Therefore,.  ** 
91a0: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65  go ahead and fre
91b0: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
91c0: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  .  */..  /* If a
91d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
91e0: 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61  open, roll it ba
91f0: 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e  ck. This also en
9200: 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20  sures that if.  
9210: 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  ** any database 
9220: 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65  schemas have bee
9230: 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e  n modified by an
9240: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61   uncommitted tra
9250: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68  nsaction.  ** th
9260: 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e  ey are reset. An
9270: 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69  d that the requi
9280: 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
9290: 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65   is held to make
92a0: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20  .  ** the pager 
92b0: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
92c0: 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f  ema reset an ato
92d0: 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a  mic operation. *
92e0: 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  /.  sqlite3Rollb
92f0: 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
9300: 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  E_OK);..  /* Fre
9310: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
9320: 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  g Savepoint stru
9330: 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c  ctures. */.  sql
9340: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
9350: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43  nts(db);..  /* C
9360: 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73  lose all databas
9370: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
9380: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
9390: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
93a0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
93b0: 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20  = &db->aDb[j];. 
93c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
93d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
93e0: 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e  BtreeClose(pDb->
93f0: 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  pBt);.      pDb-
9400: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >pBt = 0;.      
9410: 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20  if( j!=1 ){.    
9420: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
9430: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
9440: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65    }.  }.  /* Cle
9450: 61 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65  ar the TEMP sche
9460: 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e  ma separately an
9470: 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20  d last */.  if( 
9480: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
9490: 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ma ){.    sqlite
94a0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d  3SchemaClear(db-
94b0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
94c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
94d0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
94e0: 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70  );..  /* Free up
94f0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75   the array of au
9500: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
9510: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f  s */.  sqlite3Co
9520: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
9530: 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72  ray(db);.  asser
9540: 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b  t( db->nDb<=2 );
9550: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
9560: 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db==db->aDbStati
9570: 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20  c );..  /* Tell 
9580: 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69  the code in noti
9590: 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f  fy.c that the co
95a0: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67  nnection no long
95b0: 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a  er holds any.  *
95c0: 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73  * locks and does
95d0: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
95e0: 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d   further unlock-
95f0: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
9600: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
9610: 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64  ConnectionClosed
9620: 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73  (db);..  for(i=s
9630: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9640: 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69  db->aFunc); i; i
9650: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9660: 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  i)){.    FuncDef
9670: 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20   *pNext, *p;.   
9680: 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44   p = sqliteHashD
9690: 61 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a  ata(i);.    do{.
96a0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65        functionDe
96b0: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20  stroy(db, p);.  
96c0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
96d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
96e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
96f0: 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78  ;.      p = pNex
9700: 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  t;.    }while( p
9710: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
9720: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
9730: 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d  aFunc);.  for(i=
9740: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9750: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
9760: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9770: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c  ext(i)){.    Col
9780: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
9790: 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48  ollSeq *)sqliteH
97a0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
97b0: 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65  /* Invoke any de
97c0: 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74  structors regist
97d0: 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69  ered for collati
97e0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72  on sequence user
97f0: 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f   data. */.    fo
9800: 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
9810: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  {.      if( pCol
9820: 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20  l[j].xDel ){.   
9830: 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44       pColl[j].xD
9840: 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65  el(pColl[j].pUse
9850: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
9860: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
9870: 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a  ree(db, pColl);.
9880: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
9890: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c  hClear(&db->aCol
98a0: 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
98b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
98c0: 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d  ALTABLE.  for(i=
98d0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
98e0: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69  &db->aModule); i
98f0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9900: 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(i)){.    Modu
9910: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
9920: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
9930: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
9940: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29  pMod->xDestroy )
9950: 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44  {.      pMod->xD
9960: 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75  estroy(pMod->pAu
9970: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  x);.    }.    sq
9980: 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f  lite3VtabEponymo
9990: 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62 2c  usTableClear(db,
99a0: 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69   pMod);.    sqli
99b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d  te3DbFree(db, pM
99c0: 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  od);.  }.  sqlit
99d0: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
99e0: 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
99f0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  f..  sqlite3Erro
9a00: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
9a10: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
9a20: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
9a30: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
9a40: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
9a50: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71  (db->pErr);.  sq
9a60: 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73  lite3CloseExtens
9a70: 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51  ions(db);.#if SQ
9a80: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
9a90: 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74  TICATION.  sqlit
9aa0: 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68  e3_free(db->auth
9ab0: 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73  .zAuthUser);.  s
9ac0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9ad0: 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23  auth.zAuthPW);.#
9ae0: 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67  endif..  db->mag
9af0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
9b00: 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54  C_ERROR;..  /* T
9b10: 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65  he temp-database
9b20: 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63   schema is alloc
9b30: 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  ated differently
9b40: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20   from the other 
9b50: 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65  schema.  ** obje
9b60: 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74  cts (using sqlit
9b70: 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74  eMalloc() direct
9b80: 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ly, instead of s
9b90: 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
9ba0: 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74  a())..  ** So it
9bb0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
9bc0: 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57  ed here. Todo: W
9bd0: 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20  hy not roll the 
9be0: 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f  temp schema into
9bf0: 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73  .  ** the same s
9c00: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73  qliteMalloc() as
9c10: 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c   the one that al
9c20: 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61  locates the data
9c30: 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63  base .  ** struc
9c40: 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c  ture?.  */.  sql
9c50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
9c60: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9c70: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  a);.  sqlite3_mu
9c80: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9c90: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69  tex);.  db->magi
9ca0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
9cb0: 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74  _CLOSED;.  sqlit
9cc0: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62  e3_mutex_free(db
9cd0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
9ce0: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
9cf0: 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a  e.nOut==0 );  /*
9d00: 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b   Fails on a look
9d10: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61  aside memory lea
9d20: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c  k */.  if( db->l
9d30: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
9d40: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
9d50: 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61  3_free(db->looka
9d60: 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20  side.pStart);.  
9d70: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
9d80: 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  (db);.}../*.** R
9d90: 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61  ollback all data
9da0: 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20  base files.  If 
9db0: 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
9dc0: 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a  SQLITE_OK, then.
9dd0: 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63 75 72  ** any write cur
9de0: 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
9df0: 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20  ated ("tripped" 
9e00: 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e  - as in "trippin
9e10: 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62  g a circuit.** b
9e20: 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64  reaker") and mad
9e30: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70  e to return trip
9e40: 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72  Code if there ar
9e50: 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a  e any further.**
9e60: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65   attempts to use
9e70: 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52   that cursor.  R
9e80: 65 61 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61  ead cursors rema
9e90: 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69  in open and vali
9ea0: 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61  d.** but are "sa
9eb0: 76 65 64 22 20 69 6e 20 63 61 73 65 20 74 68 65  ved" in case the
9ec0: 20 74 61 62 6c 65 20 70 61 67 65 73 20 61 72 65   table pages are
9ed0: 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a   moved around..*
9ee0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
9ef0: 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65  llbackAll(sqlite
9f00: 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43  3 *db, int tripC
9f10: 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ode){.  int i;. 
9f20: 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30   int inTrans = 0
9f30: 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68  ;.  int schemaCh
9f40: 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  ange;.  assert( 
9f50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9f60: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
9f70: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
9f80: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
9f90: 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20    /* Obtain all 
9fa0: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62  b-tree mutexes b
9fb0: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79  efore making any
9fc0: 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52   calls to BtreeR
9fd0: 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a  ollback(). .  **
9fe0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
9ff0: 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  nt in case the t
a000: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
a010: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73   rolled back has
a020: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
a030: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
a040: 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  ma. If the b-tre
a050: 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f  e mutexes are no
a060: 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72  t taken.  ** her
a070: 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20  e, then another 
a080: 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e  shared-cache con
a090: 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e  nection might sn
a0a0: 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20  eak in between. 
a0b0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
a0c0: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
a0d0: 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63  hema reset, whic
a0e0: 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73  h can cause fals
a0f0: 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f  e.  ** corruptio
a100: 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d  n reports in som
a110: 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73  e cases.  */.  s
a120: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
a130: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d  All(db);.  schem
a140: 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66  aChange = (db->f
a150: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
a160: 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20  ternChanges)!=0 
a170: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  && db->init.busy
a180: 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ==0;..  for(i=0;
a190: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a1a0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
a1b0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
a1c0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
a1d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
a1e0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
a1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72   ){.        inTr
a200: 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ans = 1;.      }
a210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
a220: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74  reeRollback(p, t
a230: 72 69 70 43 6f 64 65 2c 20 21 73 63 68 65 6d 61  ripCode, !schema
a240: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20  Change);.    }. 
a250: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
a260: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
a270: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
a280: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
a290: 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
a2a0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
a2b0: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
a2c0: 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
a2d0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
a2e0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
a2f0: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
a300: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
a310: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
a320: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
a330: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
a340: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
a350: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
a360: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
a370: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
a380: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
a390: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
a3a0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
a3b0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
a3c0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
a3d0: 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a  _DeferFKs;..  /*
a3e0: 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e   If one has been
a3f0: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76   configured, inv
a400: 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  oke the rollback
a410: 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  -hook callback *
a420: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c  /.  if( db->xRol
a430: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26  lbackCallback &&
a440: 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62   (inTrans || !db
a450: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b  ->autoCommit) ){
a460: 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  .    db->xRollba
a470: 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  ckCallback(db->p
a480: 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20  RollbackArg);.  
a490: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
a4a0: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
a4b0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
a4c0: 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64   name correspond
a4d0: 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ing to the error
a4e0: 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69   code.** specifi
a4f0: 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ed in the argume
a500: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  nt..*/.#if defin
a510: 65 64 28 53 51 4c 49 54 45 5f 4e 45 45 44 5f 45  ed(SQLITE_NEED_E
a520: 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73 74 20 63  RR_NAME).const c
a530: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e  har *sqlite3ErrN
a540: 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63  ame(int rc){.  c
a550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
a560: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f   = 0;.  int i, o
a570: 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f  rigRc = rc;.  fo
a580: 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e  r(i=0; i<2 && zN
a590: 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20  ame==0; i++, rc 
a5a0: 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73 77  &= 0xff){.    sw
a5b0: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
a5c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b    case SQLITE_OK
a5d0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
a5e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a5f0: 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20  E_OK";          
a600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a610: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
a620: 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20  RROR:           
a630: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a640: 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20  TE_ERROR";      
a650: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a660: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a670: 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20  INTERNAL:       
a680: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a690: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20  ITE_INTERNAL";  
a6a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a6b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a6c0: 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20 20  _PERM:          
a6d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a6e0: 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20  LITE_PERM";     
a6f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a700: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a710: 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20 20  E_ABORT:        
a720: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a730: 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20  QLITE_ABORT";   
a740: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a750: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a760: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
a770: 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  K:     zName = "
a780: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
a790: 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61 6b  LBACK";    break
a7a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a7b0: 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20  ITE_BUSY:       
a7c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a7d0: 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20  "SQLITE_BUSY";  
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a7f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a800: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
a810: 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  RY:      zName =
a820: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45   "SQLITE_BUSY_RE
a830: 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72 65  COVERY";     bre
a840: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a850: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
a860: 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  HOT:      zName 
a870: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 53  = "SQLITE_BUSY_S
a880: 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62 72  NAPSHOT";     br
a890: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a8a0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20  SQLITE_LOCKED:  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a8c0: 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   = "SQLITE_LOCKE
a8d0: 44 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  D";            b
a8e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a8f0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
a900: 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d  HAREDCACHE: zNam
a910: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b  e = "SQLITE_LOCK
a920: 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 22 3b  ED_SHAREDCACHE";
a930: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a940: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20  e SQLITE_NOMEM: 
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a960: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d  me = "SQLITE_NOM
a970: 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  EM";            
a980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a990: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
a9a0: 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  LY:           zN
a9b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
a9c0: 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20  ADONLY";        
a9d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a9e0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
a9f0: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a  NLY_RECOVERY:  z
aa00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
aa10: 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59  EADONLY_RECOVERY
aa20: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
aa30: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
aa40: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20  ONLY_CANTLOCK:  
aa50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aa60: 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43  READONLY_CANTLOC
aa70: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
aa80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
aa90: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20  DONLY_ROLLBACK: 
aaa0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aab0: 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
aac0: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
aad0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
aae0: 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20  ADONLY_DBMOVED: 
aaf0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ab00: 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
ab10: 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ED";  break;.   
ab20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ab30: 4e 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20  NTERRUPT:       
ab40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ab50: 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20  TE_INTERRUPT";  
ab60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ab70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ab80: 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20 20  IOERR:          
ab90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aba0: 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20  ITE_IOERR";     
abb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
abc0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
abd0: 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20  _IOERR_READ:    
abe0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
abf0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22  LITE_IOERR_READ"
ac00: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
ac10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ac20: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
ac30: 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  AD:   zName = "S
ac40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
ac50: 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b  T_READ";  break;
ac60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ac70: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20  TE_IOERR_WRITE: 
ac80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ac90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
aca0: 54 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  TE";       break
acb0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
acc0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a  ITE_IOERR_FSYNC:
acd0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ace0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
acf0: 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61  YNC";       brea
ad00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ad10: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
ad20: 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  SYNC:    zName =
ad30: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
ad40: 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65  IR_FSYNC";   bre
ad50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ad60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
ad70: 43 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20  CATE:     zName 
ad80: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ad90: 54 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72  TRUNCATE";    br
ada0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
adb0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
adc0: 41 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  AT:        zName
add0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ade0: 5f 46 53 54 41 54 22 3b 20 20 20 20 20 20 20 62  _FSTAT";       b
adf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ae00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ae10: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LOCK:       zNam
ae20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ae30: 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20  R_UNLOCK";      
ae40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ae50: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
ae60: 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61  DLOCK:       zNa
ae70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ae80: 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20  RR_RDLOCK";     
ae90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aea0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
aeb0: 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e  DELETE:       zN
aec0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
aed0: 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20  ERR_DELETE";    
aee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aef0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
af00: 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a  _NOMEM:        z
af10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
af20: 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  OERR_NOMEM";    
af30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
af40: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
af50: 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20 20  R_ACCESS:       
af60: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
af70: 49 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20  IOERR_ACCESS";  
af80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
af90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
afa0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
afb0: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  LOCK:.          
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
afe0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
aff0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20  KRESERVEDLOCK"; 
b000: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b010: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  e SQLITE_IOERR_L
b020: 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  OCK:         zNa
b030: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b040: 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20  RR_LOCK";       
b050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b060: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b070: 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e  CLOSE:        zN
b080: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b090: 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20  ERR_CLOSE";     
b0a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b0b0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b0c0: 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a  _DIR_CLOSE:    z
b0d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b0e0: 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b  OERR_DIR_CLOSE";
b0f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b100: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b110: 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20  R_SHMOPEN:      
b120: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b130: 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20  IOERR_SHMOPEN"; 
b140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b150: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b160: 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20  RR_SHMSIZE:     
b170: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b180: 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b  _IOERR_SHMSIZE";
b190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b1a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b1b0: 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20  ERR_SHMLOCK:    
b1c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b1d0: 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22  E_IOERR_SHMLOCK"
b1e0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b1f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b200: 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20  OERR_SHMMAP:    
b210: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b220: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22  TE_IOERR_SHMMAP"
b230: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b240: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b250: 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20  IOERR_SEEK:     
b260: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b270: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b  ITE_IOERR_SEEK";
b280: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b290: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b2a0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
b2b0: 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ENT: zName = "SQ
b2c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
b2d0: 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a  E_NOENT";break;.
b2e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b2f0: 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20  E_IOERR_MMAP:   
b300: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b310: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
b320: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
b330: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b340: 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
b350: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
b360: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
b370: 54 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b  TEMPPATH"; break
b380: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b390: 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
b3a0: 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TH:     zName = 
b3b0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  "SQLITE_IOERR_CO
b3c0: 4e 56 50 41 54 48 22 3b 20 20 20 20 62 72 65 61  NVPATH";    brea
b3d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b3e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20  LITE_CORRUPT:   
b3f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b400: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
b410: 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ";           bre
b420: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b430: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
b440: 41 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  AB:       zName 
b450: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  = "SQLITE_CORRUP
b460: 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62 72  T_VTAB";      br
b470: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b480: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a  SQLITE_NOTFOUND:
b490: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b4a0: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   = "SQLITE_NOTFO
b4b0: 55 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62  UND";          b
b4c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b4d0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20   SQLITE_FULL:   
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b4f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c  e = "SQLITE_FULL
b500: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
b510: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b520: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
b530: 4e 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  N:           zNa
b540: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
b550: 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20  TOPEN";         
b560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b570: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
b580: 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e  EN_NOTEMPDIR: zN
b590: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
b5a0: 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52  NTOPEN_NOTEMPDIR
b5b0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
b5c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
b5d0: 50 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a  PEN_ISDIR:     z
b5e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b5f0: 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20  ANTOPEN_ISDIR"; 
b600: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b610: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
b620: 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20  OPEN_FULLPATH:  
b630: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b640: 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
b650: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
b660: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
b670: 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20  TOPEN_CONVPATH: 
b680: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b690: 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
b6a0: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
b6b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
b6c0: 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20  OTOCOL:         
b6d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b6e0: 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20  E_PROTOCOL";    
b6f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b700: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
b710: 4d 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20  MPTY:           
b720: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b730: 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20  TE_EMPTY";      
b740: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b750: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b760: 53 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20  SCHEMA:         
b770: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b780: 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20  ITE_SCHEMA";    
b790: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b7a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b7b0: 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20  _TOOBIG:        
b7c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b7d0: 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20  LITE_TOOBIG";   
b7e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b7f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b800: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20  E_CONSTRAINT:   
b810: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b820: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b830: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
b840: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b850: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
b860: 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  IQUE:  zName = "
b870: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b880: 54 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b  T_UNIQUE"; break
b890: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b8a0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
b8b0: 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20  RIGGER: zName = 
b8c0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b8d0: 4e 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61  NT_TRIGGER";brea
b8e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b8f0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b900: 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20  FOREIGNKEY:.    
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b930: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b940: 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
b950: 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  Y";   break;.   
b960: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b970: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a  ONSTRAINT_CHECK:
b980: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b990: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48  TE_CONSTRAINT_CH
b9a0: 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ECK";  break;.  
b9b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b9c0: 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
b9d0: 52 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20  RYKEY:.         
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ba00: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ba10: 54 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20  T_PRIMARYKEY";  
ba20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ba30: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
ba40: 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e  AINT_NOTNULL: zN
ba50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
ba60: 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c  NSTRAINT_NOTNULL
ba70: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
ba80: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ba90: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
baa0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bad0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
bae0: 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61  MITHOOK";   brea
baf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb00: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bb10: 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  VTAB:    zName =
bb20: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bb30: 49 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65  INT_VTAB";   bre
bb40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb50: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bb60: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bb90: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bba0: 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b  RAINT_FUNCTION";
bbb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bbc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bbd0: 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20  NSTRAINT_ROWID: 
bbe0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bbf0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
bc00: 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ID";  break;.   
bc10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
bc20: 49 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20  ISMATCH:        
bc30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bc40: 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20  TE_MISMATCH";   
bc50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bc60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bc70: 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20 20 20  MISUSE:         
bc80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bc90: 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20  ITE_MISUSE";    
bca0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bcb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bcc0: 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20  _NOLFS:         
bcd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bce0: 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20  LITE_NOLFS";    
bcf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bd00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bd10: 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20  E_AUTH:         
bd20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bd30: 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20  QLITE_AUTH";    
bd40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bd50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bd60: 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20  TE_FORMAT:      
bd70: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bd80: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20  SQLITE_FORMAT"; 
bd90: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bda0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bdb0: 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20  ITE_RANGE:      
bdc0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bdd0: 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20  "SQLITE_RANGE"; 
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bdf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
be00: 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20  LITE_NOTADB:    
be10: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
be20: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22   "SQLITE_NOTADB"
be30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
be40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
be50: 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20  QLITE_ROW:      
be60: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
be70: 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20  = "SQLITE_ROW"; 
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
be90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bea0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20  SQLITE_NOTICE:  
beb0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bec0: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
bed0: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  E";            b
bee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bef0: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52   SQLITE_NOTICE_R
bf00: 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d  ECOVER_WAL: zNam
bf10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49  e = "SQLITE_NOTI
bf20: 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b  CE_RECOVER_WAL";
bf30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bf40: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  e SQLITE_NOTICE_
bf50: 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
bf60: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bf90: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
bfa0: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61  _ROLLBACK"; brea
bfb0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bfc0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20  LITE_WARNING:   
bfd0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bfe0: 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47   "SQLITE_WARNING
bff0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ";           bre
c000: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c010: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
c020: 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20  TOINDEX:  zName 
c030: 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  = "SQLITE_WARNIN
c040: 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72  G_AUTOINDEX"; br
c050: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c060: 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20  SQLITE_DONE:    
c070: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c080: 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22   = "SQLITE_DONE"
c090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
c0a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c0b0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
c0c0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61  {.    static cha
c0d0: 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
c0e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c0f0: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
c100: 42 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b  Buf, "SQLITE_UNK
c110: 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52  NOWN(%d)", origR
c120: 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  c);.    zName = 
c130: 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75  zBuf;.  }.  retu
c140: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
c150: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
c160: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
c170: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
c180: 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
c190: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
c1a0: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  he.** argument..
c1b0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
c1c0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74  qlite3ErrStr(int
c1d0: 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63   rc){.  static c
c1e0: 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74  onst char* const
c1f0: 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMsg[] = {.    
c200: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  /* SQLITE_OK    
c210: 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e        */ "not an
c220: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
c230: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20  SQLITE_ERROR    
c240: 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63     */ "SQL logic
c250: 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e   error or missin
c260: 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20  g database",.   
c270: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   /* SQLITE_INTER
c280: 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  NAL    */ 0,.   
c290: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20   /* SQLITE_PERM 
c2a0: 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73         */ "acces
c2b0: 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e  s permission den
c2c0: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
c2d0: 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20  ITE_ABORT       
c2e0: 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71  */ "callback req
c2f0: 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f  uested query abo
c300: 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  rt",.    /* SQLI
c310: 54 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a  TE_BUSY        *
c320: 2f 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c  / "database is l
c330: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
c340: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20  QLITE_LOCKED    
c350: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74    */ "database t
c360: 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c  able is locked",
c370: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
c380: 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f  OMEM       */ "o
c390: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20  ut of memory",. 
c3a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41     /* SQLITE_REA
c3b0: 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74  DONLY    */ "att
c3c0: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20  empt to write a 
c3d0: 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73  readonly databas
c3e0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
c3f0: 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f  E_INTERRUPT   */
c400: 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a   "interrupted",.
c410: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f      /* SQLITE_IO
c420: 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69  ERR       */ "di
c430: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20  sk I/O error",. 
c440: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52     /* SQLITE_COR
c450: 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74  RUPT     */ "dat
c460: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
c470: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a   is malformed",.
c480: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
c490: 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e  TFOUND    */ "un
c4a0: 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22  known operation"
c4b0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c4c0: 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22  FULL        */ "
c4d0: 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b  database or disk
c4e0: 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f   is full",.    /
c4f0: 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  * SQLITE_CANTOPE
c500: 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20  N    */ "unable 
c510: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
c520: 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53   file",.    /* S
c530: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20  QLITE_PROTOCOL  
c540: 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72    */ "locking pr
c550: 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20  otocol",.    /* 
c560: 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20  SQLITE_EMPTY    
c570: 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e     */ "table con
c580: 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a  tains no data",.
c590: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43      /* SQLITE_SC
c5a0: 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61  HEMA      */ "da
c5b0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
c5c0: 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20  s changed",.    
c5d0: 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  /* SQLITE_TOOBIG
c5e0: 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67        */ "string
c5f0: 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67   or blob too big
c600: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c610: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20  _CONSTRAINT  */ 
c620: 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  "constraint fail
c630: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c640: 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a  TE_MISMATCH    *
c650: 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d  / "datatype mism
c660: 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51  atch",.    /* SQ
c670: 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20  LITE_MISUSE     
c680: 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75   */ "library rou
c690: 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20  tine called out 
c6a0: 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20  of sequence",.  
c6b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46    /* SQLITE_NOLF
c6c0: 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67  S       */ "larg
c6d0: 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69  e file support i
c6e0: 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20  s disabled",.   
c6f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20   /* SQLITE_AUTH 
c700: 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f         */ "autho
c710: 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22  rization denied"
c720: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c730: 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22  FORMAT      */ "
c740: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
c750: 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22  se format error"
c760: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c770: 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22  RANGE       */ "
c780: 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69  bind or column i
c790: 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndex out of rang
c7a0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
c7b0: 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f  E_NOTADB      */
c7c0: 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70   "file is encryp
c7d0: 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20  ted or is not a 
c7e0: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a  database",.  };.
c7f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
c800: 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72  rr = "unknown er
c810: 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20  ror";.  switch( 
c820: 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  rc ){.    case S
c830: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
c840: 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45  BACK: {.      zE
c850: 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20  rr = "abort due 
c860: 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  to ROLLBACK";.  
c870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c880: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
c890: 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66        rc &= 0xff
c8a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
c8b0: 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c  YS(rc>=0) && rc<
c8c0: 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20  ArraySize(aMsg) 
c8d0: 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29  && aMsg[rc]!=0 )
c8e0: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
c8f0: 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20   aMsg[rc];.     
c900: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c910: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c920: 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zErr;.}../*.*
c930: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c940: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79  mplements a busy
c950: 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73   callback that s
c960: 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a  leeps and tries.
c970: 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61  ** again until a
c980: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
c990: 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20  s reached.  The 
c9a0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
c9b0: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e  .** an integer n
c9c0: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
c9d0: 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20  conds passed in 
c9e0: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
c9f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
ca00: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65  tic int sqliteDe
ca10: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
ca20: 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20  k(. void *ptr,  
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ca40: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
ca50: 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e  ion */. int coun
ca60: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
ca70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
ca80: 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65  mes table has be
ca90: 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69  en busy */.){.#i
caa0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  f SQLITE_OS_WIN 
cab0: 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  || HAVE_USLEEP. 
cac0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
cad0: 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20   delays[] =.    
cae0: 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20   { 1, 2, 5, 10, 
caf0: 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20  15, 20, 25, 25, 
cb00: 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31   25,  50,  50, 1
cb10: 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  00 };.  static c
cb20: 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d  onst u8 totals[]
cb30: 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20   =.     { 0, 1, 
cb40: 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35  3,  8, 18, 33, 5
cb50: 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c  3, 78, 103, 128,
cb60: 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64   178, 228 };.# d
cb70: 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72  efine NDELAY Arr
cb80: 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20  aySize(delays). 
cb90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
cba0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
cbb0: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64   int timeout = d
cbc0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
cbd0: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
cbe0: 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  or;..  assert( c
cbf0: 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ount>=0 );.  if(
cc00: 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20   count < NDELAY 
cc10: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  ){.    delay = d
cc20: 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  elays[count];.  
cc30: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
cc40: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65  [count];.  }else
cc50: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
cc60: 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a  lays[NDELAY-1];.
cc70: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
cc80: 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64  ls[NDELAY-1] + d
cc90: 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45  elay*(count-(NDE
cca0: 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69  LAY-1));.  }.  i
ccb0: 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79  f( prior + delay
ccc0: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
ccd0: 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75    delay = timeou
cce0: 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69  t - prior;.    i
ccf0: 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65  f( delay<=0 ) re
cd00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
cd10: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
cd20: 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30  >pVfs, delay*100
cd30: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
cd40: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20  #else.  sqlite3 
cd50: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
cd60: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
cd70: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
cd80: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
cd90: 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e  out;.  if( (coun
cda0: 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65  t+1)*1000 > time
cdb0: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
cdc0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
cdd0: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
cde0: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
cdf0: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
ce00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
ce10: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
ce20: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
ce30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ce40: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
ce50: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77  eration failed w
ce60: 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49  ith a lock..** I
ce70: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
ce80: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
ce90: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
cea0: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
ceb0: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
cec0: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
ced0: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
cee0: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
cef0: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
cf00: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
cf10: 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e  andler *p){.  in
cf20: 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45  t rc;.  if( NEVE
cf30: 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46  R(p==0) || p->xF
cf40: 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75  unc==0 || p->nBu
cf50: 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  sy<0 ) return 0;
cf60: 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63  .  rc = p->xFunc
cf70: 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75  (p->pArg, p->nBu
cf80: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  sy);.  if( rc==0
cf90: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
cfa0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
cfb0: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
cfc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cfd0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
cfe0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
cff0: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
d000: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
d010: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
d020: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
d030: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
d040: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
d050: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d060: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
d070: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
d080: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
d090: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
d0a0: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
d0b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
d0c0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
d0d0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
d0e0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
d0f0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d100: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
d110: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d120: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
d130: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78  b->busyHandler.x
d140: 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20 20  Func = xBusy;.  
d150: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
d160: 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64  pArg = pArg;.  d
d170: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
d180: 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Busy = 0;.  db->
d190: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b  busyTimeout = 0;
d1a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d1b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
d1c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
d1d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
d1e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
d1f0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
d200: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d210: 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67  ne sets the prog
d220: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ress callback fo
d230: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
d240: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
d250: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
d260: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
d270: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  given argument. 
d280: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
d290: 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65  lback will.** be
d2a0: 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e   invoked every n
d2b0: 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  Ops opcodes..*/.
d2c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f  void sqlite3_pro
d2d0: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20  gress_handler(. 
d2e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
d2f0: 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74   int nOps,.  int
d300: 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f   (*xProgress)(vo
d310: 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70  id*), .  void *p
d320: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
d330: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
d340: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
d350: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
d360: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
d370: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
d380: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
d390: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
d3a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d3b0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d3c0: 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a    if( nOps>0 ){.
d3d0: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
d3e0: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
d3f0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
d400: 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Ops = (unsigned)
d410: 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50  nOps;.    db->pP
d420: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
d430: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
d440: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
d450: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  0;.    db->nProg
d460: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
d470: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
d480: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  g = 0;.  }.  sql
d490: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d4a0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  (db->mutex);.}.#
d4b0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
d4c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
d4d0: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
d4e0: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
d4f0: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
d500: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
d510: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
d520: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
d530: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
d540: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
d550: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
d560: 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53  nt ms){.#ifdef S
d570: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
d580: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
d590: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
d5a0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
d5b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d5c0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
d5d0: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c   ms>0 ){.    sql
d5e0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
d5f0: 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61  r(db, sqliteDefa
d600: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c  ultBusyCallback,
d610: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20   (void*)db);.   
d620: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d630: 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = ms;.  }else{.
d640: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
d650: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20  _handler(db, 0, 
d660: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
d670: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d680: 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70  *.** Cause any p
d690: 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ending operation
d6a0: 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20   to stop at its 
d6b0: 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75  earliest opportu
d6c0: 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nity..*/.void sq
d6d0: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
d6e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
d6f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d700: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
d710: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
d720: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
d730: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
d740: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
d750: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
d760: 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73  ndif.  db->u1.is
d770: 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b  Interrupted = 1;
d780: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
d790: 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63  function is exac
d7a0: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20  tly the same as 
d7b0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
d7c0: 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70  unction(), excep
d7d0: 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  t.** that it is 
d7e0: 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63  designed to be c
d7f0: 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61  alled by interna
d800: 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66  l code. The diff
d810: 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61  erence is.** tha
d820: 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  t if a malloc() 
d830: 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33  fails in sqlite3
d840: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
d850: 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  (), an error cod
d860: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
d870: 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46   and the mallocF
d880: 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72  ailed flag clear
d890: 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ed. .*/.int sqli
d8a0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20  te3CreateFunc(. 
d8b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
d8c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
d8d0: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
d8e0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
d8f0: 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44  ,.  void *pUserD
d900: 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  ata,.  void (*xS
d910: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
d920: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
d930: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
d940: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
d950: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
d960: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
d970: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
d980: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
d990: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63  ontext*),.  Func
d9a0: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
d9b0: 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e  tructor.){.  Fun
d9c0: 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cDef *p;.  int n
d9d0: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72  Name;.  int extr
d9e0: 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72  aFlags;..  asser
d9f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
da00: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
da10: 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74   );.  if( zFunct
da20: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20  ionName==0 ||.  
da30: 20 20 20 20 28 78 53 46 75 6e 63 20 26 26 20 28      (xSFunc && (
da40: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
da50: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 53  ) || .      (!xS
da60: 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20  Func && (xFinal 
da70: 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20  && !xStep)) ||. 
da80: 20 20 20 20 20 28 21 78 53 46 75 6e 63 20 26 26       (!xSFunc &&
da90: 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74   (!xFinal && xSt
daa0: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e  ep)) ||.      (n
dab0: 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53  Arg<-1 || nArg>S
dac0: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
dad0: 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20  ON_ARG) ||.     
dae0: 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73   (255<(nName = s
daf0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20  qlite3Strlen30( 
db00: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29  zFunctionName)))
db10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
db20: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
db30: 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  T;.  }..  assert
db40: 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  ( SQLITE_FUNC_CO
db50: 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44  NSTANT==SQLITE_D
db60: 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a  ETERMINISTIC );.
db70: 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65    extraFlags = e
db80: 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54  nc &  SQLITE_DET
db90: 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e  ERMINISTIC;.  en
dba0: 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e  c &= (SQLITE_FUN
dbb0: 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45  C_ENCMASK|SQLITE
dbc0: 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65  _ANY);.  .#ifnde
dbd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
dbe0: 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  F16.  /* If SQLI
dbf0: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
dc00: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
dc10: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
dc20: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
dc30: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
dc40: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
dc50: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
dc60: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
dc70: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
dc80: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
dc90: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
dca0: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ernally..  **.  
dcb0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59  ** If SQLITE_ANY
dcc0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61   is specified, a
dcd0: 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e  dd three version
dce0: 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  s of the functio
dcf0: 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61  n.  ** to the ha
dd00: 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  sh table..  */. 
dd10: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
dd20: 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e  _UTF16 ){.    en
dd30: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
dd40: 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20  NATIVE;.  }else 
dd50: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
dd60: 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ANY ){.    int r
dd70: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
dd80: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
dd90: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
dda0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
ddb0: 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  F8|extraFlags,. 
ddc0: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
ddd0: 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  a, xSFunc, xStep
dde0: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
ddf0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
de00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
de10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
de20: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
de30: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
de40: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
de50: 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73  F16LE|extraFlags
de60: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
de70: 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78  rData, xSFunc, x
de80: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44  Step, xFinal, pD
de90: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
dea0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
deb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ded0: 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  }.    enc = SQLI
dee0: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a  TE_UTF16BE;.  }.
def0: 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51  #else.  enc = SQ
df00: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69  LITE_UTF8;.#endi
df10: 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  f.  .  /* Check 
df20: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66  if an existing f
df30: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
df40: 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64   overridden or d
df50: 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20  eleted. If so,. 
df60: 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
df70: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68  e active VMs, th
df80: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
df90: 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63  _BUSY. If a func
dfa0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69  tion.  ** is bei
dfb0: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65  ng overridden/de
dfc0: 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20  leted but there 
dfd0: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
dfe0: 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a  s, allow the.  *
dff0: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63  * operation to c
e000: 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61  ontinue but inva
e010: 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f  lidate all preco
e020: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
e030: 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  s..  */.  p = sq
e040: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
e050: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
e060: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
e070: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
e080: 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73  && (p->funcFlags
e090: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
e0a0: 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20  NCMASK)==enc && 
e0b0: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b  p->nArg==nArg ){
e0c0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
e0d0: 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
e0e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
e0f0: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
e100: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
e110: 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
e120: 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75  e/modify user-fu
e130: 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63  nction due to ac
e140: 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
e150: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e160: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
e170: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
e180: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
e190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e1a0: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
e1b0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
e1c0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
e1d0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
e1e0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
e1f0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
e200: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b  rg, (u8)enc, 1);
e210: 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64  .  assert(p || d
e220: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
e230: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
e240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e250: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
e260: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65  .  /* If an olde
e270: 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  r version of the
e280: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61   function with a
e290: 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74   configured dest
e2a0: 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62  ructor is.  ** b
e2b0: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e  eing replaced in
e2c0: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
e2d0: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  tor function her
e2e0: 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e  e. */.  function
e2f0: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
e300: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
e310: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
e320: 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  uctor->nRef++;. 
e330: 20 7d 0a 20 20 70 2d 3e 75 2e 70 44 65 73 74 72   }.  p->u.pDestr
e340: 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63  uctor = pDestruc
e350: 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c  tor;.  p->funcFl
e360: 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c  ags = (p->funcFl
e370: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
e380: 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74  C_ENCMASK) | ext
e390: 72 61 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63  raFlags;.  testc
e3a0: 61 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67  ase( p->funcFlag
e3b0: 73 20 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52  s & SQLITE_DETER
e3c0: 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d  MINISTIC );.  p-
e3d0: 3e 78 53 46 75 6e 63 20 3d 20 78 53 46 75 6e 63  >xSFunc = xSFunc
e3e0: 20 3f 20 78 53 46 75 6e 63 20 3a 20 78 53 74 65   ? xSFunc : xSte
e3f0: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
e400: 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d  e = xFinal;.  p-
e410: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
e420: 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72  erData;.  p->nAr
e430: 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20  g = (u16)nArg;. 
e440: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e450: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
e460: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
e470: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
e480: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e490: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
e4a0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
e4b0: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
e4c0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
e4d0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
e4e0: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
e4f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e500: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e510: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e520: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
e530: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e540: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e550: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
e560: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
e570: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
e580: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e590: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e  tion_v2(db, zFun
e5a0: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
e5b0: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a   xSFunc, xStep,.
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a      xFinal, 0);.
e5f0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  }..int sqlite3_c
e600: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
e610: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
e620: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e630: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
e640: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
e650: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
e660: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e670: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e690: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e6a0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e6b0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e6c0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e6d0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e6e0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
e6f0: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29  void (*xDestroy)
e700: 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e  (void *).){.  in
e710: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
e720: 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72  ROR;.  FuncDestr
e730: 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b  uctor *pArg = 0;
e740: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e750: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e760: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
e770: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
e780: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e790: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e7a0: 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
e7b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e7c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e7d0: 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29    if( xDestroy )
e7e0: 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75  {.    pArg = (Fu
e7f0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73  ncDestructor *)s
e800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
e810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75  ro(db, sizeof(Fu
e820: 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a  ncDestructor));.
e830: 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b      if( !pArg ){
e840: 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28  .      xDestroy(
e850: 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  p);.      goto o
e860: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ut;.    }.    pA
e870: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
e880: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
e890: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
e8a0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
e8b0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
e8c0: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
e8d0: 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20  enc, p, xSFunc, 
e8e0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
e8f0: 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67  Arg);.  if( pArg
e900: 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d   && pArg->nRef==
e910: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
e920: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e930: 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70  ;.    xDestroy(p
e940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e950: 46 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a  Free(db, pArg);.
e960: 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20    }.. out:.  rc 
e970: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
e980: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
e990: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e9a0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
e9b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
e9c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e9d0: 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65  UTF16.int sqlite
e9e0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
e9f0: 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  n16(.  sqlite3 *
ea00: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db,.  const void
ea10: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
ea20: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
ea30: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76  nt eTextRep,.  v
ea40: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
ea50: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
ea60: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
ea70: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
ea80: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
ea90: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
eaa0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
eab0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
eac0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
ead0: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69  context*).){.  i
eae0: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
eaf0: 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53  Func8;..#ifdef S
eb00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
eb10: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
eb20: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
eb30: 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74  Ok(db) || zFunct
eb40: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ionName==0 ) ret
eb50: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
eb60: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
eb70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
eb80: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
eb90: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
eba0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
ebb0: 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74    zFunc8 = sqlit
ebc0: 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
ebd0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31  FunctionName, -1
ebe0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
ebf0: 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71  TIVE);.  rc = sq
ec00: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
ec10: 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67  db, zFunc8, nArg
ec20: 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78  , eTextRep, p, x
ec30: 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e  SFunc,xStep,xFin
ec40: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
ec50: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
ec60: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
ec70: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
ec80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
ec90: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
eca0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
ecb0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
ecc0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
ecd0: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
ece0: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
ecf0: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
ed00: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
ed10: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
ed20: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
ed30: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
ed40: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
ed50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
ed60: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
ed70: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
ed80: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
ed90: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
eda0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
edb0: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
edc0: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
edd0: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
ede0: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
edf0: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
ee00: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
ee10: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
ee20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
ee30: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
ee40: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
ee50: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
ee60: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
ee70: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
ee80: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
ee90: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
eea0: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
eeb0: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
eec0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
eed0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
eee0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
eef0: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
ef00: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ef10: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ef20: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
ef30: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
ef40: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
ef50: 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ) || zName==0 ||
ef60: 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20   nArg<-2 ){.    
ef70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
ef80: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
ef90: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
efa0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
efb0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
efc0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
efd0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  n(db, zName, nAr
efe0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
eff0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  0)==0 ){.    rc 
f000: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
f010: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
f020: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
f030: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
f050: 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
f060: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  nction, 0, 0, 0)
f070: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f080: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
f090: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
f0a0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f0b0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f0c0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
f0d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
f0e0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f0f0: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
f100: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
f110: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
f120: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
f130: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
f140: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
f150: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
f160: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
f170: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
f180: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
f190: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
f1a0: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
f1b0: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
f1c0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f1d0: 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74  f each.** SQL st
f1e0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e  atement..*/.#ifn
f1f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f200: 44 45 50 52 45 43 41 54 45 44 0a 76 6f 69 64 20  DEPRECATED.void 
f210: 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73  *sqlite3_trace(s
f220: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
f230: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
f240: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
f250: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
f260: 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
f270: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f280: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f290: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f2a0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f2b0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
f2c0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
f2d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
f2e0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f2f0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f300: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
f310: 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64  ->pTraceArg;.  d
f320: 62 2d 3e 6d 54 72 61 63 65 20 3d 20 78 54 72 61  b->mTrace = xTra
f330: 63 65 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 43  ce ? SQLITE_TRAC
f340: 45 5f 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20 20  E_LEGACY : 0;.  
f350: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 28 69 6e  db->xTrace = (in
f360: 74 28 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76  t(*)(u32,void*,v
f370: 6f 69 64 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61  oid*,void*))xTra
f380: 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65  ce;.  db->pTrace
f390: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
f3a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f3b0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
f3c0: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
f3d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f3e0: 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 20  OMIT_DEPRECATED 
f3f0: 2a 2f 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72 20  */../* Register 
f400: 61 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b  a trace callback
f410: 20 75 73 69 6e 67 20 74 68 65 20 76 65 72 73 69   using the versi
f420: 6f 6e 2d 32 20 69 6e 74 65 72 66 61 63 65 2e 0a  on-2 interface..
f430: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
f440: 72 61 63 65 5f 76 32 28 0a 20 20 73 71 6c 69 74  race_v2(.  sqlit
f450: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 20 20 20 20 2f 2a 20 54 72 61 63 65 20 74        /* Trace t
f480: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
f490: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 72  /.  unsigned mTr
f4a0: 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f4c0: 2a 20 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74 73  * Mask of events
f4d0: 20 74 6f 20 62 65 20 74 72 61 63 65 64 20 2a 2f   to be traced */
f4e0: 0a 20 20 69 6e 74 28 2a 78 54 72 61 63 65 29 28  .  int(*xTrace)(
f4f0: 75 6e 73 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76  unsigned,void*,v
f500: 6f 69 64 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a  oid*,void*),  /*
f510: 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76   Callback to inv
f520: 6f 6b 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  oke */.  void *p
f530: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a      /* Context *
f560: 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  /.){.#ifdef SQLI
f570: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f580: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f590: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f5a0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
f5b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
f5c0: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
f5d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f5e0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f5f0: 29 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65 20  );.  db->mTrace 
f600: 3d 20 6d 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = mTrace;.  db->
f610: 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b  xTrace = xTrace;
f620: 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
f630: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
f640: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f650: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f660: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f670: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f680: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
f690: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f6a0: 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  a profile functi
f6b0: 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72  on.  The pArg fr
f6c0: 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  om the previousl
f6d0: 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a  y registered .**
f6e0: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
f6f0: 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  n is returned.  
f700: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72  .**.** A NULL pr
f710: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d  ofile function m
f720: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f  eans that no pro
f730: 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74  filing is execut
f740: 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a  es.  A non-NULL.
f750: 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20  ** profile is a 
f760: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
f770: 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e  ction that is in
f780: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
f790: 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61  clusion of.** ea
f7a0: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
f7b0: 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f   that is run..*/
f7c0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70  .void *sqlite3_p
f7d0: 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  rofile(.  sqlite
f7e0: 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a  3 *db,.  void (*
f7f0: 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c  xProfile)(void*,
f800: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
f810: 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f  te_uint64),.  vo
f820: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f  id *pArg.){.  vo
f830: 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
f840: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f850: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f860: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f870: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f880: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
f890: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
f8a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
f8b0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f8c0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f8d0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
f8e0: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a  b->pProfileArg;.
f8f0: 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d    db->xProfile =
f900: 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d   xProfile;.  db-
f910: 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70  >pProfileArg = p
f920: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
f930: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f940: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f950: 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
f960: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
f970: 50 52 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64  PRECATED */.#end
f980: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f990: 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  T_TRACE */../*.*
f9a0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e  * Register a fun
f9b0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
f9c0: 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  ked when a trans
f9d0: 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a  action commits..
f9e0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65  ** If the invoke
f9f0: 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  d function retur
fa00: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
fa10: 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63  n the commit bec
fa20: 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61  omes a.** rollba
fa30: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ck..*/.void *sql
fa40: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
fa50: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa70: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
fa80: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
fa90: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61  e */.  int (*xCa
faa0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
fab0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
fac0: 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63  invoke on each c
fad0: 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20  ommit */.  void 
fae0: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
faf0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
fb00: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
fb10: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
fb20: 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
fb30: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
fb40: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
fb50: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
fb60: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
fb70: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
fb80: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
fb90: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
fba0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fbb0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
fbc0: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43  .  pOld = db->pC
fbd0: 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e  ommitArg;.  db->
fbe0: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
fbf0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
fc00: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20  b->pCommitArg = 
fc10: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
fc20: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
fc30: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
fc40: 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOld;.}../*.** 
fc50: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
fc60: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
fc70: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
fc80: 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
fc90: 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
fca0: 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
fcb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
fcc0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
fcd0: 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
fce0: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
fcf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
fd00: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
fd10: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
fd20: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
fd30: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
fd40: 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  int,char const *
fd50: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71  ,char const *,sq
fd60: 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76  lite_int64),.  v
fd70: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
fd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
fd90: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
fda0: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
fdb0: 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66  d *pRet;..#ifdef
fdc0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
fdd0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
fde0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
fdf0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
fe00: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
fe10: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
fe20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
fe30: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
fe40: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
fe50: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
fe60: 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20  ->pUpdateArg;.  
fe70: 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
fe80: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
fe90: 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72  .  db->pUpdateAr
fea0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
feb0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
fec0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
fed0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
fee0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
fef0: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
ff00: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
ff10: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
ff20: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
ff30: 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
ff40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
ff50: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f  void *sqlite3_ro
ff60: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73  llback_hook(.  s
ff70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
ff80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
ff90: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
ffa0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
ffb0: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
ffc0: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43  ck)(void*), /* C
ffd0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
ffe0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
10010 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
10020 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
10030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10040 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
10050 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
10060 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
10070 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
10080 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10090 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
100a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
100b0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
100c0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
100d0 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  et = db->pRollba
100e0 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f  ckArg;.  db->xRo
100f0 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d  llbackCallback =
10100 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
10110 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d  ->pRollbackArg =
10120 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
10130 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10140 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
10150 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  n pRet;.}..#ifde
10160 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10170 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f  PREUPDATE_HOOK./
10180 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
10190 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
101a0 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
101b0 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
101c0 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
101d0 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
101e0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
101f0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
10200 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70  d *sqlite3_preup
10210 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  date_hook(.  sql
10220 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10230 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
10240 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
10250 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
10260 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29  void(*xCallback)
10270 28 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c  (         /* Cal
10280 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
10290 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69  /.    void*,sqli
102a0 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  te3*,int,char co
102b0 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a  nst*,char const*
102c0 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73  ,sqlite3_int64,s
102d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20  qlite3_int64),. 
102e0 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
102f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
10300 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67  rst callback arg
10310 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ument */.){.  vo
10320 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
10330 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10340 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
10350 65 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64  et = db->pPreUpd
10360 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ateArg;.  db->xP
10370 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  reUpdateCallback
10380 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
10390 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
103a0 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
103b0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
103c0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
103d0 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
103e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
103f0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
10400 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  OOK */..#ifndef 
10410 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
10420 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
10430 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
10440 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
10450 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   by sqlite3_wal_
10460 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
10470 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ..** Invoke sqli
10480 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
10490 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72  nt if the number
104a0 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
104b0 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73  e log file.** is
104c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71   greater than sq
104d0 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61  lite3.pWalArg ca
104e0 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  st to an integer
104f0 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66   (the value conf
10500 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c  igured by.** wal
10510 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
10520 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ))..*/ .int sqli
10530 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
10540 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65  k(.  void *pClie
10550 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41  ntData,     /* A
10560 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  rgument */.  sql
10570 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10580 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
10590 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
105a0 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a  r *zDb,       /*
105b0 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   Database */.  i
105c0 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20  nt nFrame       
105d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
105e0 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28   WAL */.){.  if(
105f0 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f   nFrame>=SQLITE_
10600 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65  PTR_TO_INT(pClie
10610 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73  ntData) ){.    s
10620 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
10630 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73  nMalloc();.    s
10640 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
10650 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a  point(db, zDb);.
10660 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
10670 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10680 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
10690 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
106a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
106b0 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  L */../*.** Conf
106c0 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33  igure an sqlite3
106d0 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
106e0 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69  back to automati
106f0 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
10700 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
10710 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fter committing 
10720 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  a transaction if
10730 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d   there are nFram
10740 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61  e or.** more fra
10750 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
10760 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72  ile. Passing zer
10770 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20  o or a negative 
10780 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20  value as the.** 
10790 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72  nFrame parameter
107a0 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61   disables automa
107b0 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  tic checkpoints 
107c0 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  entirely..**.** 
107d0 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  The callback reg
107e0 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20  istered by this 
107f0 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65  function replace
10800 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63  s any existing c
10810 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73  allback.** regis
10820 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69  tered using sqli
10830 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20  te3_wal_hook(). 
10840 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74  Likewise, regist
10850 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b  ering a callback
10860 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65  .** using sqlite
10870 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73  3_wal_hook() dis
10880 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61  ables the automa
10890 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d  tic checkpoint m
108a0 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66  echanism.** conf
108b0 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66  igured by this f
108c0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
108d0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
108e0 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
108f0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61  e3 *db, int nFra
10900 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  me){.#ifdef SQLI
10910 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e  TE_OMIT_WAL.  UN
10920 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
10930 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  b);.  UNUSED_PAR
10940 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a  AMETER(nFrame);.
10950 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c  #else.#ifdef SQL
10960 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10970 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
10980 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
10990 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
109a0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
109b0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e  ;.#endif.  if( n
109c0 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73  Frame>0 ){.    s
109d0 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
109e0 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65  db, sqlite3WalDe
109f0 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54  faultHook, SQLIT
10a00 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72  E_INT_TO_PTR(nFr
10a10 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ame));.  }else{.
10a20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
10a30 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a  hook(db, 0, 0);.
10a40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
10a50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10a60 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
10a70 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
10a80 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
10a90 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
10aa0 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  n is written.** 
10ab0 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61  into the write-a
10ac0 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73  head-log by this
10ad0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
10ae0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
10af0 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
10b00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
10b30 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62   hook to this db
10b40 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
10b50 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
10b60 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  d *, sqlite3*, c
10b70 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
10b80 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
10bb0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
10bc0 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29  xCallback() */.)
10bd0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
10be0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64  _OMIT_WAL.  void
10bf0 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53   *pRet;.#ifdef S
10c00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
10c10 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
10c20 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
10c30 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
10c40 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
10c50 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
10c60 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
10c70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10c80 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
10c90 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
10ca0 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78  pWalArg;.  db->x
10cb0 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  WalCallback = xC
10cc0 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
10cd0 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  WalArg = pArg;. 
10ce0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10cf0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10d00 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
10d10 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
10d20 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10d30 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
10d40 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e  abase zDb..*/.in
10d50 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
10d60 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73  eckpoint_v2(.  s
10d70 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d90 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
10da0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
10db0 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
10dc0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10dd0 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
10de0 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ase (or NULL) */
10df0 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20  .  int eMode,   
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45     /* SQLITE_CHE
10e20 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20  CKPOINT_* value 
10e30 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  */.  int *pnLog,
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
10e60 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20  e of WAL log in 
10e70 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20  frames */.  int 
10e80 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20  *pnCkpt         
10e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10ea0 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72  UT: Total number
10eb0 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b   of frames check
10ec0 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69  pointed */.){.#i
10ed0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
10ee0 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51  _WAL.  return SQ
10ef0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
10f00 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10f30 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53  */.  int iDb = S
10f40 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
10f50 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e  ED;  /* sqlite3.
10f60 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64  aDb[] index of d
10f70 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  b to checkpoint 
10f80 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
10f90 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10fa0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10fb0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10fc0 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
10fd0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10fe0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69  #endif..  /* Ini
10ff0 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70  tialize the outp
11000 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ut variables to 
11010 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  -1 in case an er
11020 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
11030 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e   if( pnLog ) *pn
11040 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Log = -1;.  if( 
11050 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74  pnCkpt ) *pnCkpt
11060 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74   = -1;..  assert
11070 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
11080 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29  INT_PASSIVE==0 )
11090 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
110a0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
110b0 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  LL==1 );.  asser
110c0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
110d0 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20  OINT_RESTART==2 
110e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
110f0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
11100 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20  RUNCATE==3 );.  
11110 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
11120 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
11130 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
11140 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
11150 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f  RUNCATE ){.    /
11160 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11170 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54 68 65  -03996-12088 The
11180 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73   M parameter mus
11190 74 20 62 65 20 61 20 76 61 6c 69 64 20 63 68 65  t be a valid che
111a0 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d  ckpoint.    ** m
111b0 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75  ode: */.    retu
111c0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
111d0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
111e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
111f0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
11200 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
11210 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
11220 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
11230 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
11240 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
11250 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
11260 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11270 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
11280 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
11290 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
112a0 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
112b0 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  .    db->busyHan
112c0 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
112d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
112e0 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69  Checkpoint(db, i
112f0 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Db, eMode, pnLog
11300 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73  , pnCkpt);.    s
11310 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
11320 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  rc);.  }.  rc = 
11330 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
11340 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
11350 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11360 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
11370 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
11380 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
11390 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
113a0 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c   If zDb is NULL,
113b0 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65   or if the buffe
113c0 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20  r zDb points.** 
113d0 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65  to contains a ze
113e0 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67  ro-length string
113f0 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  , all attached d
11400 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a  atabases are .**
11410 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a   checkpointed..*
11420 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
11430 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  l_checkpoint(sql
11440 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
11450 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a  char *zDb){.  /*
11460 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11470 34 31 36 31 33 2d 32 30 35 35 33 20 54 68 65 20  41613-20553 The 
11480 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
11490 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69 73 20 65  kpoint(D,X) is e
114a0 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a  quivalent to.  *
114b0 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  * sqlite3_wal_ch
114c0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c  eckpoint_v2(D,X,
114d0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
114e0 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 2e 20  T_PASSIVE,0,0). 
114f0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
11500 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
11510 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c  nt_v2(db,zDb,SQL
11520 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
11530 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a  ASSIVE,0,0);.}..
11540 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11550 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75  MIT_WAL./*.** Ru
11560 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f  n a checkpoint o
11570 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
11580 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
11590 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  if database iDb 
115a0 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e  is.** not curren
115b0 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20  tly open in WAL 
115c0 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  mode..**.** If a
115d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
115e0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
115f0 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b  base being check
11600 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a  pointed, this .*
11610 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
11620 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ns SQLITE_LOCKED
11630 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e   and a checkpoin
11640 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  t is not attempt
11650 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  ed. If .** an er
11660 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
11670 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65   running the che
11680 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69  ckpoint, an SQLi
11690 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
116a0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69   .** returned (i
116b0 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .e. SQLITE_IOERR
116c0 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ). Otherwise, SQ
116d0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
116e0 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
116f0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73  base handle db s
11700 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79  hould be held by
11710 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65   the caller. The
11720 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69   mutex.** associ
11730 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ated with the sp
11740 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65  ecific b-tree be
11750 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
11760 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20   is taken by.** 
11770 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68  this function wh
11780 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
11790 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a  nt is running..*
117a0 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70  *.** If iDb is p
117b0 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  assed SQLITE_MAX
117c0 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20  _ATTACHED, then 
117d0 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
117e0 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68  abases are.** ch
117f0 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61  eckpointed. If a
11800 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
11810 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74  ntered it is ret
11820 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
11830 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70  y -.** no attemp
11840 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65  t is made to che
11850 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61  ckpoint any rema
11860 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e  ining databases.
11870 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
11880 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66   eMode is one of
11890 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
118a0 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c  NT_PASSIVE, FULL
118b0 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a   or RESTART..*/.
118c0 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
118d0 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
118e0 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
118f0 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f  eMode, int *pnLo
11900 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b  g, int *pnCkpt){
11910 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11920 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
11930 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
11940 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
11970 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
11980 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a  h attached dbs *
11990 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20  /.  int bBusy = 
119a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
119b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53      /* True if S
119c0 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62  QLITE_BUSY has b
119d0 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  een encountered 
119e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
119f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11a00 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
11a10 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20   assert( !pnLog 
11a20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b  || *pnLog==-1 );
11a30 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b  .  assert( !pnCk
11a40 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d  pt || *pnCkpt==-
11a50 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  1 );..  for(i=0;
11a60 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63   i<db->nDb && rc
11a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
11a80 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44  ){.    if( i==iD
11a90 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45  b || iDb==SQLITE
11aa0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b  _MAX_ATTACHED ){
11ab0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11ac0 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69  te3BtreeCheckpoi
11ad0 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  nt(db->aDb[i].pB
11ae0 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  t, eMode, pnLog,
11af0 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20   pnCkpt);.      
11b00 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20  pnLog = 0;.     
11b10 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20   pnCkpt = 0;.   
11b20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11b30 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
11b40 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20    bBusy = 1;.   
11b50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11b60 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
11b70 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
11b80 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
11b90 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49  && bBusy) ? SQLI
11ba0 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a  TE_BUSY : rc;.}.
11bb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11bc0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
11bd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11be0 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
11bf0 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68  f main-memory sh
11c00 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73  ould be used ins
11c10 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d  tead of.** a tem
11c20 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20  porary file for 
11c30 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20  transient pager 
11c40 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d  files and statem
11c50 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ent journals..**
11c60 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
11c70 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ned depends on t
11c80 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e  he value of db->
11c90 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74  temp_store (runt
11ca0 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ime.** parameter
11cb0 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  ) and the compil
11cc0 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20  e time value of 
11cd0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
11ce0 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  E. The.** follow
11cf0 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
11d00 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  bes the relation
11d10 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65  ship between the
11d20 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  se two values.**
11d30 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
11d40 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ons return value
11d50 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
11d60 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20  _TEMP_STORE     
11d70 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20  db->temp_store  
11d80 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74     Location of t
11d90 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
11da0 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
11db0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
11dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
11df0 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
11e00 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
11e20 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
11e30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
11e70 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
11ea0 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
11eb0 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20  turn 1).**   1  
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
11ee0 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
11ef0 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
11f00 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
11f10 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
11f20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
11f30 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
11f40 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
11f50 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
11f60 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
11f70 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
11f80 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
11f90 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
11fb0 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
11fc0 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20   1).**   3      
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
11fe0 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
11ff0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
12000 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71  urn 1).*/.int sq
12010 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
12020 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20  y(const sqlite3 
12030 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *db){.#if SQLITE
12040 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20  _TEMP_STORE==1. 
12050 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
12060 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23  mp_store==2 );.#
12070 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
12080 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20  _TEMP_STORE==2. 
12090 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
120a0 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23  mp_store!=1 );.#
120b0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
120c0 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20  _TEMP_STORE==3. 
120d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
120e0 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(db);.  return 
120f0 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  1;.#endif.#if SQ
12100 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c  LITE_TEMP_STORE<
12110 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50  1 || SQLITE_TEMP
12120 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53 45  _STORE>3.  UNUSE
12130 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
12140 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
12150 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
12160 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  urn UTF-8 encode
12170 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
12180 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
12190 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
121a0 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
121b0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
121c0 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65  e3_errmsg(sqlite
121d0 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20  3 *db){.  const 
121e0 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21  char *z;.  if( !
121f0 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
12200 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
12210 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12220 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
12230 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
12240 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
12250 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
12260 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
12270 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
12280 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
12290 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
122a0 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
122b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
122c0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
122d0 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
122e0 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b  _BKPT);.  }else{
122f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64  .    testcase( d
12300 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20  b->pErr==0 );.  
12310 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c    z = (char*)sql
12320 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
12330 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61  db->pErr);.    a
12340 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
12350 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
12360 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
12370 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
12380 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
12390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
123a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
123b0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
123c0 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
123d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
123e0 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74  _UTF16./*.** Ret
123f0 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64  urn UTF-16 encod
12400 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
12410 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
12420 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
12430 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
12440 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
12450 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c  te3_errmsg16(sql
12460 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61  ite3 *db){.  sta
12470 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75  tic const u16 ou
12480 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20  tOfMem[] = {.   
12490 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
124a0 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27  ' ', 'o', 'f', '
124b0 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d   ', 'm', 'e', 'm
124c0 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27  ', 'o', 'r', 'y'
124d0 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  , 0.  };.  stati
124e0 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75  c const u16 misu
124f0 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27  se[] = {.    'l'
12500 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c  , 'i', 'b', 'r',
12510 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'a', 'r', 'y', 
12520 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27  ' ', .    'r', '
12530 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69  o', 'u', 't', 'i
12540 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27  ', 'n', 'e', ' '
12550 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c  , .    'c', 'a',
12560 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20   'l', 'l', 'e', 
12570 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'd', ' ', .    '
12580 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
12590 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27  ', .    'o', 'f'
125a0 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c  , ' ', .    's',
125b0 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20   'e', 'q', 'u', 
125c0 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27  'e', 'n', 'c', '
125d0 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f  e', 0.  };..  co
125e0 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69  nst void *z;.  i
125f0 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
12600 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74  turn (void *)out
12610 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  OfMem;.  }.  if(
12620 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
12630 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
12640 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
12650 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20  void *)misuse;. 
12660 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
12670 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
12680 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
12690 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
126a0 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f     z = (void *)o
126b0 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65  utOfMem;.  }else
126c0 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
126d0 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
126e0 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66  b->pErr);.    if
126f0 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
12700 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
12710 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43  Msg(db, db->errC
12720 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53  ode, sqlite3ErrS
12730 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29  tr(db->errCode))
12740 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
12750 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
12760 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
12770 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  }.    /* A mallo
12780 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69  c() may have fai
12790 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  led within the c
127a0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  all to sqlite3_v
127b0 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20  alue_text16().  
127c0 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
127d0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
127e0 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
127f0 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
12800 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
12810 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
12820 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20  e returning. Do 
12830 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69  this directly, i
12840 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20  nstead of via.  
12850 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45    ** sqlite3ApiE
12860 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20  xit(), to avoid 
12870 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61  setting the data
12880 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f  base handle erro
12890 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a  r message..    *
128a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  /.    sqlite3Oom
128b0 43 6c 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20  Clear(db);.  }. 
128c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
128d0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
128e0 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
128f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12900 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
12910 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12920 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
12930 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  r code generated
12940 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f   by an SQLite ro
12950 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69  utine. If NULL i
12960 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74  s.** passed to t
12970 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65  his function, we
12980 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63   assume a malloc
12990 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67  () failed during
129a0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
129b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
129c0 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
129d0 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
129e0 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
129f0 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
12a00 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
12a10 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
12a20 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
12a30 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
12a40 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
12a50 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12a60 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
12a70 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20  urn db->errCode 
12a80 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
12a90 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
12aa0 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71  ended_errcode(sq
12ab0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
12ac0 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33  ( db && !sqlite3
12ad0 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
12ae0 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
12af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
12b00 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
12b10 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d  if( !db || db->m
12b20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12b40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
12b50 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
12b60 72 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rCode;.}.int sql
12b70 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e  ite3_system_errn
12b80 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  o(sqlite3 *db){.
12b90 20 20 72 65 74 75 72 6e 20 64 62 20 3f 20 64 62    return db ? db
12ba0 2d 3e 69 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b  ->iSysErrno : 0;
12bb0 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  .}  ../*.** Retu
12bc0 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
12bd0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
12be0 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
12bf0 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
12c00 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20   argument.  For 
12c10 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79  now, this simply
12c20 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72   calls the inter
12c30 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74  nal sqlite3ErrSt
12c40 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  r().** function.
12c50 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
12c60 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69  sqlite3_errstr(i
12c70 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e  nt rc){.  return
12c80 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
12c90 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  c);.}../*.** Cre
12ca0 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ate a new collat
12cb0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
12cc0 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20   database "db". 
12cd0 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61   The name is zNa
12ce0 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e  me.** and the en
12cf0 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a  coding is enc..*
12d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
12d10 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  ateCollation(.  
12d20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63  sqlite3* db,.  c
12d30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
12d40 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76  , .  u8 enc,.  v
12d50 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
12d60 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
12d70 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
12d80 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
12d90 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
12da0 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
12db0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
12dc0 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61  int enc2;.  .  a
12dd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12de0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
12df0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
12e00 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
12e10 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
12e20 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
12e30 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
12e40 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
12e50 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
12e60 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
12e70 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
12e80 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
12e90 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
12ea0 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
12eb0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
12ec0 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b  */.  enc2 = enc;
12ed0 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
12ee0 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
12ef0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  );.  testcase( e
12f00 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
12f10 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69  6_ALIGNED );.  i
12f20 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  f( enc2==SQLITE_
12f30 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53  UTF16 || enc2==S
12f40 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
12f50 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20  NED ){.    enc2 
12f60 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
12f70 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TIVE;.  }.  if( 
12f80 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38  enc2<SQLITE_UTF8
12f90 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f   || enc2>SQLITE_
12fa0 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72  UTF16BE ){.    r
12fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
12fc0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  USE_BKPT;.  }.. 
12fd0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
12fe0 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69  s call is removi
12ff0 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20  ng or replacing 
13000 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c  an existing coll
13010 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75  ation .  ** sequ
13020 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64  ence. If so, and
13030 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
13040 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75  e VMs, return bu
13050 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a  sy. If there.  *
13060 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
13070 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  VMs, invalidate 
13080 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  any pre-compiled
13090 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
130a0 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  /.  pColl = sqli
130b0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
130c0 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
130d0 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43  me, 0);.  if( pC
130e0 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
130f0 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  mp ){.    if( db
13100 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
13110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
13120 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
13130 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
13140 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
13150 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
13160 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
13170 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
13180 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
13190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
131a0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
131b0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
131c0 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
131d0 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  (db);..    /* If
131e0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
131f0 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
13200 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
13210 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
13220 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
13230 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
13240 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
13250 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
13260 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
13270 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
13280 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
13290 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
132a0 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
132b0 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
132c0 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
132d0 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
132e0 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
132f0 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
13300 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
13310 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
13320 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
13330 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
13340 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
13350 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
13360 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
13370 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a  ollSeq, zName);.
13380 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
13390 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
133a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
133b0 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f  ollSeq *p = &aCo
133c0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
133d0 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  f( p->enc==pColl
133e0 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  ->enc ){.       
133f0 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29     if( p->xDel )
13400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
13410 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b  >xDel(p->pUser);
13420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13430 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d         p->xCmp =
13440 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
13450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13460 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
13470 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
13480 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
13490 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 1);.  if( pCo
134a0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
134b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
134c0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  ;.  pColl->xCmp 
134d0 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  = xCompare;.  pC
134e0 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74  oll->pUser = pCt
134f0 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  x;.  pColl->xDel
13500 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c   = xDel;.  pColl
13510 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
13520 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
13530 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
13540 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  );.  sqlite3Erro
13550 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
13560 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13570 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
13580 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
13590 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
135a0 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
135b0 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
135c0 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
135d0 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
135e0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
135f0 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
13600 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
13610 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
13620 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
13630 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
13640 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
13650 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
13660 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
13670 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
13680 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
13690 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
136a0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
136b0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
136c0 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
136d0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
136e0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
136f0 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
13700 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
13710 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
13720 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
13730 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20  NUMBER,      /* 
13740 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33  IMP: R-38091-323
13750 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d  52 */.  SQLITE_M
13760 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
13770 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ,.  SQLITE_MAX_W
13780 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d  ORKER_THREADS,.}
13790 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
137a0 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69  re the hard limi
137b0 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65  ts are set to re
137c0 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a  asonable values.
137d0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
137e0 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  X_LENGTH<100.# e
137f0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13800 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
13810 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
13820 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13830 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30  X_SQL_LENGTH<100
13840 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13850 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
13860 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
13870 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
13880 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
13890 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  NGTH>SQLITE_MAX_
138a0 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53  LENGTH.# error S
138b0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
138c0 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65  NGTH must not be
138d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
138e0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
138f0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13900 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
13910 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20  ELECT<2.# error 
13920 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
13930 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20  UND_SELECT must 
13940 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65  be at least 2.#e
13950 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13960 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23  MAX_VDBE_OP<40.#
13970 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13980 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62  X_VDBE_OP must b
13990 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65  e at least 40.#e
139a0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
139b0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
139c0 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
139d0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32  _FUNCTION_ARG>12
139e0 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
139f0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
13a00 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  G must be betwee
13a10 6e 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64  n 0 and 127.#end
13a20 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13a30 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
13a40 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
13a50 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20  HED>125.# error 
13a60 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
13a70 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77  HED must be betw
13a80 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65  een 0 and 125.#e
13a90 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13aa0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
13ab0 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f  _LENGTH<1.# erro
13ac0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  r SQLITE_MAX_LIK
13ad0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
13ae0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13af0 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
13b00 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
13b10 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53  >32767.# error S
13b20 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
13b30 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64   must not exceed
13b40 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69   32767.#endif.#i
13b50 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  f SQLITE_MAX_TRI
13b60 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65  GGER_DEPTH<1.# e
13b70 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13b80 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75  TRIGGER_DEPTH mu
13b90 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
13ba0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13bb0 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
13bc0 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54  READS<0 || SQLIT
13bd0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13be0 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20  EADS>50.# error 
13bf0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
13c00 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62  R_THREADS must b
13c10 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
13c20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  50.#endif.../*.*
13c30 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
13c40 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
13c50 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
13c60 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
13c70 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
13c80 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
13c90 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
13ca0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
13cb0 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
13cc0 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
13cd0 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
13ce0 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
13cf0 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
13d00 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
13d10 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
13d20 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
13d30 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
13d40 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
13d50 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
13d60 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
13d70 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
13d80 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
13d90 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
13da0 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
13db0 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
13dc0 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  mit;..#ifdef SQL
13dd0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
13de0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
13df0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
13e00 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
13e10 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
13e20 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
13e30 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
13e40 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
13e50 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
13e60 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
13e70 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
13e80 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
13e90 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
13ea0 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
13eb0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
13ec0 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
13ed0 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
13ee0 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
13ef0 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
13f00 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
13f10 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
13f20 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
13f30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
13f40 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13f50 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
13f60 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
13f80 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13f90 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
13fa0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
13fb0 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
13fc0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13fd0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
13fe0 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
13ff0 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
14000 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
14010 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
14020 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
14030 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
14040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
14050 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
14060 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
14070 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
14080 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
14090 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
140a0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
140b0 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
140c0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
140d0 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
140e0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
140f0 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
14100 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
14110 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
14120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
14130 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14140 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
14150 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
14160 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
14170 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
14180 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
14190 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
141d0 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
141e0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
141f0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
14200 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
14210 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
14220 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
14230 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
14240 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
14250 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
14260 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
14270 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
14280 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
14290 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
142a0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
142b0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
142c0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  ]==SQLITE_MAX_WO
142d0 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a  RKER_THREADS );.
142e0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
142f0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
14300 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e  READS==(SQLITE_N
14310 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
14320 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
14330 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
14340 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
14350 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
14360 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
14370 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
14380 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
14390 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
143a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
143b0 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
143c0 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
143d0 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
143e0 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
143f0 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
14400 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
14410 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
14420 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
14430 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
14440 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
14450 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
14460 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14480 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
14490 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
144a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
144b0 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
144c0 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
144d0 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
144e0 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
144f0 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
14500 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
14510 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
14520 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
14530 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
14540 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
14550 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
14560 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
14570 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
14580 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
14590 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
145a0 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
145b0 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
145c0 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
145d0 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
145e0 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
145f0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
14600 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
14610 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
14620 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
14630 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
14640 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
14650 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
14660 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
14670 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
14680 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
14690 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
146a0 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
146b0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
146c0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
146d0 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
146e0 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
146f0 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
14700 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
14710 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
14720 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
14730 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
14740 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
14750 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
14760 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
14770 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
14780 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
14790 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
147a0 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
147b0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
147c0 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
147d0 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
147e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
147f0 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
14800 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
14810 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
14820 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
14830 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
14840 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
14850 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14860 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
14870 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
14880 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
14890 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
148a0 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
148b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
148c0 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
148d0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
148e0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
148f0 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
14900 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
14910 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
14920 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
14930 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
14940 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
14950 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
14960 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
14970 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
14980 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
14990 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
149a0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
149b0 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
149c0 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
149d0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
149e0 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
149f0 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
14a00 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
14a10 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
14a20 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a40 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
14a50 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
14a60 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
14a70 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
14a80 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
14a90 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
14aa0 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
14ab0 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
14ac0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
14ad0 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
14ae0 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
14b10 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
14b20 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
14b30 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
14b40 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
14b50 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
14b60 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
14b70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
14b80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
14b90 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
14ba0 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
14bb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
14bc0 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
14bd0 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
14be0 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
14bf0 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
14c00 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
14c10 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
14c20 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
14c30 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
14c40 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20  PEN_URI)        
14c50 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
14c60 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20  8725-32206 */.  
14c70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
14c80 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14c90 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d  .bOpenUri) /* IM
14ca0 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38  P: R-51689-46548
14cb0 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d   */.   && nUri>=
14cc0 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69  5 && memcmp(zUri
14cd0 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30  , "file:", 5)==0
14ce0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34   /* IMP: R-57884
14cf0 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20  -37496 */.  ){. 
14d00 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20     char *zOpt;. 
14d10 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20     int eState;  
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65   /* Parser state
14d40 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52   when parsing UR
14d50 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e  I */.    int iIn
14d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14d70 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
14d80 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
14d90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  */.    int iOut 
14da0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14db0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
14dc0 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
14dd0 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20  /.    u64 nByte 
14de0 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20  = nUri+2;       
14df0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
14e00 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
14e10 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  e */..    /* Mak
14e20 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54  e sure the SQLIT
14e30 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
14e40 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
14e50 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f  te to the VFS xO
14e60 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68  pen .    ** meth
14e70 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61  od that there ma
14e80 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d  y be extra param
14e90 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eters following 
14ea0 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20  the file-name.  
14eb0 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  */.    flags |= 
14ec0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
14ed0 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b  ..    for(iIn=0;
14ee0 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b   iIn<nUri; iIn++
14ef0 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69  ) nByte += (zUri
14f00 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20  [iIn]=='&');.   
14f10 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
14f20 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
14f30 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65  ;.    if( !zFile
14f40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14f50 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20  _NOMEM_BKPT;..  
14f60 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65    iIn = 5;.#ifde
14f70 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55  f SQLITE_ALLOW_U
14f80 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20  RI_AUTHORITY.   
14f90 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
14fa0 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d  i+5, "///", 3)==
14fb0 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  0 ){.      iIn =
14fc0 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   7;.      /* The
14fd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69   following condi
14fe0 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73  tion causes URIs
14ff0 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69   with five leadi
15000 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a  ng / characters.
15010 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69        ** like fi
15020 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74  le://///host/pat
15030 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65  h to be converte
15040 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65  d into UNCs like
15050 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20   //host/path..  
15060 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65      ** The corre
15070 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20  ct URI for that 
15080 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f  UNC has only two
15090 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67   or four leading
150a0 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
150b0 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f      ** file://ho
150c0 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a  st/path or file:
150d0 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20  ////host/path.  
150e0 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c  But 5 leading sl
150f0 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20  ashes is a .    
15100 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f    ** common erro
15110 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20  r, we are told, 
15120 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20  so we handle it 
15130 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
15140 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
15150 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20  strncmp(zUri+7, 
15160 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20  "///", 3)==0 ){ 
15170 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  iIn++; }.    }el
15180 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
15190 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68  Uri+5, "//localh
151a0 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b  ost/", 12)==0 ){
151b0 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b  .      iIn = 16;
151c0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
151d0 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
151e0 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f  scheme and autho
151f0 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66  rity segments of
15200 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20   the URI. */.   
15210 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f   if( zUri[5]=='/
15220 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f  ' && zUri[6]=='/
15230 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  ' ){.      iIn =
15240 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   7;.      while(
15250 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
15260 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69  ri[iIn]!='/' ) i
15270 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
15280 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d  iIn!=7 && (iIn!=
15290 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f  16 || memcmp("lo
152a0 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b  calhost", &zUri[
152b0 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20  7], 9)) ){.     
152c0 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
152d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
152e0 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68  invalid uri auth
152f0 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20  ority: %.*s", . 
15300 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37             iIn-7
15310 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20  , &zUri[7]);.   
15320 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15330 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
15340 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
15350 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
15360 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
15370 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61   Copy the filena
15380 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79  me and any query
15390 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f   parameters into
153a0 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65   the zFile buffe
153b0 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64  r. .    ** Decod
153c0 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64  e %HH escape cod
153d0 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79  es along the way
153e0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
153f0 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   Within this loo
15400 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61  p, variable eSta
15410 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  te may be set to
15420 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65   0, 1 or 2, depe
15430 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  nding.    ** on 
15440 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  the parsing cont
15450 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  ext. As follows:
15460 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
15470 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65   0: Parsing file
15480 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20  -name..    **   
15490 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20  1: Parsing name 
154a0 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
154b0 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
154c0 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20  rameter..    ** 
154d0 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c    2: Parsing val
154e0 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  ue section of a 
154f0 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
15500 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
15510 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20  */.    eState = 
15520 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
15530 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30   = zUri[iIn])!=0
15540 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20   && c!='#' ){.  
15550 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
15560 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20   if( c=='%' .   
15570 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
15580 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d  xdigit(zUri[iIn]
15590 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ) .       && sql
155a0 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72  ite3Isxdigit(zUr
155b0 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20  i[iIn+1]) .     
155c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
155d0 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33  octet = (sqlite3
155e0 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
155f0 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20  n++]) << 4);.   
15600 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71       octet += sq
15610 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55  lite3HexToInt(zU
15620 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20  ri[iIn++]);..   
15630 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74       assert( oct
15640 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32  et>=0 && octet<2
15650 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  56 );.        if
15660 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20  ( octet==0 ){.  
15670 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
15680 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
15690 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61  when "%00" appea
156a0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52  rs within the UR
156b0 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20  I. In this.     
156c0 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20       ** case we 
156d0 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20  ignore all text 
156e0 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  in the remainder
156f0 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61   of the path, na
15700 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  me or.          
15710 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74  ** value current
15720 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e  ly being parsed.
15730 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   So ignore the c
15740 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72  urrent character
15750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
15760 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65  d skip to the ne
15770 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22  xt "?", "=" or "
15780 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  &", as appropria
15790 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
157a0 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
157b0 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
157c0 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='#' .          
157d0 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
157e0 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20  0 || c!='?').   
157f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
15800 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d  State!=1 || (c!=
15810 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a  '=' && c!='&')).
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
15830 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63   (eState!=2 || c
15840 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20  !='&').         
15850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15860 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
15870 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
15880 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
15890 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74  .        c = oct
158a0 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  et;.      }else 
158b0 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26  if( eState==1 &&
158c0 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27   (c=='&' || c=='
158d0 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =') ){.        i
158e0 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d  f( zFile[iOut-1]
158f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15900 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74   /* An empty opt
15910 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65  ion name. Ignore
15920 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74   this option alt
15930 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  ogether. */.    
15940 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
15950 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
15960 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69  In]!='#' && zUri
15970 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69  [iIn-1]!='&' ) i
15980 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
15990 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
159a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
159b0 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20  c=='&' ){.      
159c0 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
159d0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
159e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
159f0 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20     eState = 2;. 
15a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15a10 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   c = 0;.      }e
15a20 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d  lse if( (eState=
15a30 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c  =0 && c=='?') ||
15a40 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63   (eState==2 && c
15a50 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20  =='&') ){.      
15a60 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
15a70 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20   eState = 1;.   
15a80 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65     }.      zFile
15a90 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [iOut++] = c;.  
15aa0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61    }.    if( eSta
15ab0 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f  te==1 ) zFile[iO
15ac0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
15ad0 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
15ae0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
15af0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
15b00 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
15b10 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e  if there were an
15b20 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66  y options specif
15b30 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ied that should 
15b40 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a  be interpreted .
15b50 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74      ** here. Opt
15b60 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e  ions that are in
15b70 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69  terpreted here i
15b80 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64  nclude "vfs" and
15b90 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20   those that.    
15ba0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ** correspond to
15bb0 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20   flags that may 
15bc0 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  be passed to the
15bd0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
15be0 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ().    ** method
15bf0 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20  . */.    zOpt = 
15c00 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74  &zFile[sqlite3St
15c10 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d  rlen30(zFile)+1]
15c20 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70  ;.    while( zOp
15c30 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  t[0] ){.      in
15c40 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  t nOpt = sqlite3
15c50 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a  Strlen30(zOpt);.
15c60 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c        char *zVal
15c70 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d   = &zOpt[nOpt+1]
15c80 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  ;.      int nVal
15c90 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15ca0 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20  30(zVal);..     
15cb0 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20   if( nOpt==3 && 
15cc0 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f  memcmp("vfs", zO
15cd0 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 3)==0 ){.   
15ce0 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c       zVfs = zVal
15cf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15d00 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70         struct Op
15d10 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20  enMode {.       
15d20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15d30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
15d40 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20  mode;.        } 
15d50 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  *aMode = 0;.    
15d60 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54      char *zModeT
15d70 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ype = 0;.       
15d80 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20   int mask = 0;. 
15d90 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74         int limit
15da0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69   = 0;..        i
15db0 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65  f( nOpt==5 && me
15dc0 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f  mcmp("cache", zO
15dd0 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 5)==0 ){.   
15de0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
15df0 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43  ruct OpenMode aC
15e00 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  acheMode[] = {. 
15e10 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68             { "sh
15e20 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f  ared",  SQLITE_O
15e30 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
15e40 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
15e50 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49   "private", SQLI
15e60 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
15e70 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  ACHE },.        
15e80 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
15e90 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
15ea0 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
15eb0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
15ec0 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  CHE|SQLITE_OPEN_
15ed0 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20  PRIVATECACHE;.  
15ee0 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
15ef0 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20  aCacheMode;.    
15f00 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
15f10 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  sk;.          zM
15f20 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65  odeType = "cache
15f30 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
15f40 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34       if( nOpt==4
15f50 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65   && memcmp("mode
15f60 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29  ", zOpt, 4)==0 )
15f70 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
15f80 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f  ic struct OpenMo
15f90 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d  de aOpenMode[] =
15fa0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
15fb0 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "ro",  SQLITE_O
15fc0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a  PEN_READONLY },.
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
15fe0 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  w",  SQLITE_OPEN
15ff0 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20  _READWRITE }, . 
16000 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
16010 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  c", SQLITE_OPEN_
16020 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
16030 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
16040 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
16050 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45  "memory", SQLITE
16060 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a  _OPEN_MEMORY },.
16070 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
16080 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
16090 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
160a0 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
160b0 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54  READONLY | SQLIT
160c0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
160d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
160e0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
160f0 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
16100 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20  E_OPEN_MEMORY;. 
16110 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
16120 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20   aOpenMode;.    
16130 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
16140 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20  sk & flags;.    
16150 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
16160 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20  = "access";.    
16170 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
16180 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20  f( aMode ){.    
16190 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
161a0 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20         int mode 
161b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
161c0 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d  or(i=0; aMode[i]
161d0 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .z; i++){.      
161e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
161f0 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a   *z = aMode[i].z
16200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
16210 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53  ( nVal==sqlite3S
16220 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d  trlen30(z) && 0=
16230 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c  =memcmp(zVal, z,
16240 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20   nVal) ){.      
16250 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61          mode = a
16260 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20  Mode[i].mode;.  
16270 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
16280 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
16290 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
162a0 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d         if( mode=
162b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
162c0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
162d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
162e0 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20  o such %s mode: 
162f0 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20  %s", zModeType, 
16300 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
16310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
16320 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
16330 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
16340 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
16350 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
16360 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f  (mode & ~SQLITE_
16370 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d  OPEN_MEMORY)>lim
16380 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
16390 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
163a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
163b0 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77  s mode not allow
163c0 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ed: %s",.       
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
16400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
16410 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  c = SQLITE_PERM;
16420 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
16430 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
16440 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16450 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28         flags = (
16460 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c  flags & ~mask) |
16470 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
16480 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16490 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61  zOpt = &zVal[nVa
164a0 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  l+1];.    }..  }
164b0 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20  else{.    zFile 
164c0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
164d0 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20  64(nUri+2);.    
164e0 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
164f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
16500 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70  _BKPT;.    memcp
16510 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e  y(zFile, zUri, n
16520 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  Uri);.    zFile[
16530 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nUri] = '\0';.  
16540 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20    zFile[nUri+1] 
16550 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67  = '\0';.    flag
16560 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
16570 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70  N_URI;.  }..  *p
16580 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
16590 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20  fs_find(zVfs);. 
165a0 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29   if( *ppVfs==0 )
165b0 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
165c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
165d0 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20  f("no such vfs: 
165e0 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  %s", zVfs);.    
165f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
16600 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72  R;.  }. parse_ur
16610 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  i_out:.  if( rc!
16620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16630 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
16640 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  File);.    zFile
16650 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c   = 0;.  }.  *pFl
16660 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a  ags = flags;.  *
16670 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  pzFile = zFile;.
16680 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16690 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
166a0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
166b0 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64  k of opening a d
166c0 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c  atabase on behal
166d0 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  f of.** sqlite3_
166e0 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74  open() and sqlit
166f0 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65  e3_open16(). The
16700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
16710 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20  me "zFilename"  
16720 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63  .** is UTF-8 enc
16730 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oded..*/.static 
16740 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65  int openDatabase
16750 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
16760 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61  zFilename, /* Da
16770 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
16780 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f  UTF-8 encoded */
16790 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
167a0 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  b,        /* OUT
167b0 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62  : Returned datab
167c0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
167d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
167e0 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74  gs,    /* Operat
167f0 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20  ional flags */. 
16800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
16810 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  s       /* Name 
16820 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73  of the VFS to us
16830 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
16840 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
16850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
16860 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e  re allocated han
16870 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
16880 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
168a0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
168b0 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61    int isThreadsa
168c0 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fe;             
168d0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68    /* True for th
168e0 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74  readsafe connect
168f0 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
16900 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  zOpen = 0;      
16910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
16920 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74  ename argument t
16930 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f  o pass to BtreeO
16940 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  pen() */.  char 
16950 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20  *zErrMsg = 0;   
16960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
16970 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
16980 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
16990 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  () */..#ifdef SQ
169a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
169b0 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62  ARMOR.  if( ppDb
169c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
169d0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
169e0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20  .#endif.  *ppDb 
169f0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
16a00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
16a10 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
16a20 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
16a30 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
16a40 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f   rc;.#endif..  /
16a50 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e  * Only allow sen
16a60 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
16a70 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ns of bits in th
16a80 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
16a90 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61  .  .  ** Throw a
16aa0 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e  n error if any n
16ab0 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61  on-sense combina
16ac0 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49  tion is used.  I
16ad0 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74  f we.  ** do not
16ae0 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63   block illegal c
16af0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65  ombinations here
16b00 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67  , it could trigg
16b10 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  er.  ** assert()
16b20 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64   statements in d
16b30 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53  eeper layers.  S
16b40 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
16b50 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20  ions.  ** are:. 
16b60 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51   **.  **  1:  SQ
16b70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16b80 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c  LY.  **  2:  SQL
16b90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16ba0 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c  TE.  **  6:  SQL
16bb0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16bc0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
16bd0 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61  _CREATE.  */.  a
16be0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
16bf0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20  EN_READONLY  == 
16c00 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0x01 );.  assert
16c10 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
16c20 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20  ADWRITE == 0x02 
16c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
16c40 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16c50 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20     == 0x04 );.  
16c60 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
16c70 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29  lags&7))==0x02 )
16c80 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f  ; /* READONLY */
16c90 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
16ca0 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
16cb0 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  4 ); /* READWRIT
16cc0 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  E */.  testcase(
16cd0 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
16ce0 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44  =0x40 ); /* READ
16cf0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a  WRITE | CREATE *
16d00 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c  /.  if( ((1<<(fl
16d10 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d  ags&7)) & 0x46)=
16d20 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
16d30 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
16d40 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  KPT;  /* IMP: R-
16d50 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20  65497-44594 */. 
16d60 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65   }..  if( sqlite
16d70 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
16d80 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  oreMutex==0 ){. 
16d90 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
16da0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
16db0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
16dc0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a  OPEN_NOMUTEX ){.
16dd0 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
16de0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
16df0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
16e00 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
16e10 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
16e20 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  afe = 1;.  }else
16e30 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
16e40 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  fe = sqlite3Glob
16e50 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
16e60 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  tex;.  }.  if( f
16e70 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16e80 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
16e90 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ){.    flags &= 
16ea0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41  ~SQLITE_OPEN_SHA
16eb0 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73  REDCACHE;.  }els
16ec0 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
16ed0 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
16ee0 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
16ef0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
16f00 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
16f10 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ACHE;.  }..  /* 
16f20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62  Remove harmful b
16f30 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61  its from the fla
16f40 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  gs parameter.  *
16f50 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54  *.  ** The SQLIT
16f60 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61  E_OPEN_NOMUTEX a
16f70 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  nd SQLITE_OPEN_F
16f80 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77  ULLMUTEX flags w
16f90 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77  ere.  ** dealt w
16fa0 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69  ith in the previ
16fb0 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20  ous code block. 
16fc0 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20   Besides these, 
16fd0 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61  the only.  ** va
16fe0 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20  lid input flags 
16ff0 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  for sqlite3_open
17000 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45  _v2() are SQLITE
17010 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a  _OPEN_READONLY,.
17020 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
17030 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49  _READWRITE, SQLI
17040 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
17050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
17060 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51  EDCACHE,.  ** SQ
17070 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
17080 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65  ECACHE, and some
17090 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20   reserved bits. 
170a0 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20   Silently mask. 
170b0 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65   ** off all othe
170c0 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20  r flags..  */.  
170d0 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c  flags &=  ~( SQL
170e0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
170f0 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
17100 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
17110 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17130 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
17140 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
17150 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
17160 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
17170 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17180 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
17190 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
171a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
171b0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
171c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
171d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
171e0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
171f0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17200 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
17210 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
17220 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
17230 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
17240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
17260 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
17270 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17280 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20  _FULLMUTEX |.   
17290 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
172a0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20  TE_OPEN_WAL.    
172b0 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f           );..  /
172c0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
172d0 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63  qlite data struc
172e0 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73  ture */.  db = s
172f0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
17300 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ( sizeof(sqlite3
17310 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  ) );.  if( db==0
17320 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f   ) goto opendb_o
17330 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65  ut;.  if( isThre
17340 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62  adsafe ){.    db
17350 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
17360 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
17370 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
17380 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
17390 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
173a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
173b0 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20  db);.      db = 
173c0 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  0;.      goto op
173d0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
173e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
173f0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
17400 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
17410 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62  ask = 0xff;.  db
17420 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d  ->nDb = 2;.  db-
17430 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
17440 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62  MAGIC_BUSY;.  db
17450 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
17460 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74  tatic;..  assert
17470 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  ( sizeof(db->aLi
17480 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61  mit)==sizeof(aHa
17490 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65  rdLimit) );.  me
174a0 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c  mcpy(db->aLimit,
174b0 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a   aHardLimit, siz
174c0 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29  eof(db->aLimit))
174d0 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ;.  db->aLimit[S
174e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
174f0 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51  ER_THREADS] = SQ
17500 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52  LITE_DEFAULT_WOR
17510 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64  KER_THREADS;.  d
17520 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
17530 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74  1;.  db->nextAut
17540 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d  ovac = -1;.  db-
17550 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65  >szMmap = sqlite
17560 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
17570 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74  Mmap;.  db->next
17580 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20  Pagesize = 0;.  
17590 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
175a0 61 70 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b  ap = 0x7FFFFFFF;
175b0 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
175c0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
175d0 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e  ames | SQLITE_En
175e0 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51  ableTrigger | SQ
175f0 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a  LITE_CacheSpill.
17600 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
17610 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
17620 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20  MATIC_INDEX) || 
17630 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
17640 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  | SQLITE_AutoInd
17670 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ex.#endif.#if SQ
17680 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50  LITE_DEFAULT_CKP
17690 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20  TFULLFSYNC.     
176a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
176b0 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79  LITE_CkptFullFSy
176c0 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  nc.#endif.#if SQ
176d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
176e0 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
176f0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17700 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
17710 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
17720 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
17730 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17750 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
17760 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
17770 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17780 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
17790 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
177a0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
177b0 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
177c0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
177d0 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
177e0 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49  GN_KEYS) && SQLI
177f0 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
17800 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20  GN_KEYS.        
17810 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17820 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65  E_ForeignKeys.#e
17830 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
17840 28 53 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f  (SQLITE_REVERSE_
17850 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54  UNORDERED_SELECT
17860 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S).             
17870 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76      | SQLITE_Rev
17880 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66  erseOrder.#endif
17890 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
178a0 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
178b0 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   | SQLITE_CellSi
178e0 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20  zeCk.#endif.#if 
178f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
17900 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e  NABLE_FTS3_TOKEN
17910 49 5a 45 52 29 0a 20 20 20 20 20 20 20 20 20 20  IZER).          
17920 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
17930 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65  Fts3Tokenizer.#e
17940 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
17950 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
17960 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
17970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17980 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
17990 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
179a0 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
179b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
179c0 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
179d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
179e0 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
179f0 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
17a00 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
17a10 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
17a20 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
17a30 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
17a40 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
17a50 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
17a60 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
17a70 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
17a80 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
17a90 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ure..  **.  ** E
17aa0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32  VIDENCE-OF: R-52
17ab0 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65  786-44878 SQLite
17ac0 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62   defines three b
17ad0 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
17ae0 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  g.  ** functions
17af0 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  :.  */.  createC
17b00 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c  ollation(db, sql
17b10 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53  ite3StrBINARY, S
17b20 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62  QLITE_UTF8, 0, b
17b30 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
17b40 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
17b50 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72  n(db, sqlite3Str
17b60 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55  BINARY, SQLITE_U
17b70 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16BE, 0, binCo
17b80 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
17b90 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
17ba0 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  , sqlite3StrBINA
17bb0 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  RY, SQLITE_UTF16
17bc0 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  LE, 0, binCollFu
17bd0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
17be0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e  Collation(db, "N
17bf0 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55  OCASE", SQLITE_U
17c00 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f  TF8, 0, nocaseCo
17c10 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b  llatingFunc, 0);
17c20 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
17c30 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20  on(db, "RTRIM", 
17c40 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
17c50 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75  id*)1, binCollFu
17c60 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
17c70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17c80 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
17c90 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20  b_out;.  }.  /* 
17ca0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
17cb0 38 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64  8308-17224 The d
17cc0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
17cd0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c   function for al
17ce0 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69  l.  ** strings i
17cf0 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a  s BINARY. .  */.
17d00 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
17d10 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
17d20 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
17d30 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72  UTF8, sqlite3Str
17d40 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73  BINARY, 0);.  as
17d50 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43  sert( db->pDfltC
17d60 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  oll!=0 );..  /* 
17d70 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61  Parse the filena
17d80 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e  me/URI argument.
17d90 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
17da0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
17db0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  c = sqlite3Parse
17dc0 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e  Uri(zVfs, zFilen
17dd0 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62  ame, &flags, &db
17de0 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20  ->pVfs, &zOpen, 
17df0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
17e00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17e10 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
17e20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c  LITE_NOMEM ) sql
17e30 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
17e40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
17e50 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
17e60 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  , zErrMsg ? "%s"
17e70 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a   : 0, zErrMsg);.
17e80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17e90 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67  (zErrMsg);.    g
17ea0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
17eb0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
17ec0 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62  he backend datab
17ed0 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20  ase driver */.  
17ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17ef0 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
17f00 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e  zOpen, db, &db->
17f10 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20  aDb[0].pBt, 0,. 
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53         flags | S
17f40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
17f50 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  DB);.  if( rc!=S
17f60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17f70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
17f80 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
17f90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17fa0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
17fb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
17fc0 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20  or(db, rc);.    
17fd0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
17fe0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
17ff0 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62  reeEnter(db->aDb
18000 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
18010 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
18020 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
18030 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
18040 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62  .pBt);.  if( !db
18050 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18060 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d   ENC(db) = SCHEM
18070 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c  A_ENC(db);.  sql
18080 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 64  ite3BtreeLeave(d
18090 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
180a0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63    db->aDb[1].pSc
180b0 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
180c0 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a  hemaGet(db, 0);.
180d0 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
180e0 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  t safety_level f
180f0 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
18100 62 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f  base is FULL; fo
18110 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20  r the temp.  ** 
18120 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20 4f  database it is O
18130 46 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  FF. This matches
18140 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
18150 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a   defaults.  .  *
18160 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a  /.  db->aDb[0].z
18170 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22  DbSName = "main"
18180 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  ;.  db->aDb[0].s
18190 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51  afety_level = SQ
181a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
181b0 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64 62  CHRONOUS+1;.  db
181c0 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[1].zDbSNam
181d0 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62  e = "temp";.  db
181e0 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f  ->aDb[1].safety_
181f0 6c 65 76 65 6c 20 3d 20 50 41 47 45 52 5f 53 59  level = PAGER_SY
18200 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a  NCHRONOUS_OFF;..
18210 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
18220 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
18230 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
18240 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
18250 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
18260 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
18270 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20  er all built-in 
18280 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64  functions, but d
18290 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
182a0 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64   read the.  ** d
182b0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79  atabase schema y
182c0 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61  et. This is dela
182d0 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  yed until the fi
182e0 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74  rst time the dat
182f0 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63  abase.  ** is ac
18300 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  cessed..  */.  s
18310 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
18320 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
18330 6c 69 74 65 33 52 65 67 69 73 74 65 72 50 65 72  lite3RegisterPer
18340 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69  ConnectionBuilti
18350 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  nFunctions(db);.
18360 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
18370 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
18380 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
18390 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
183a0 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
183b0 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
183c0 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
183d0 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
183e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
183f0 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20  code(db);.  if( 
18400 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18410 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
18420 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
18430 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
18440 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
18450 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18470 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
18480 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
18490 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
184a0 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
184b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
184c0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
184d0 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
184e0 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
184f0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
18500 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
18510 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
18520 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
18530 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
18540 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
18550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18560 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
18570 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
18580 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
18590 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
185a0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
185b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
185c0 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75 74  ABLE_FTS3 /* aut
185d0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e  omatically defin
185e0 65 64 20 62 79 20 53 51 4c 49 54 45 5f 45 4e 41  ed by SQLITE_ENA
185f0 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66  BLE_FTS4 */.  if
18600 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18610 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
18620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
18630 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
18640 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
18650 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18660 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20 69 66  ENABLE_FTS5.  if
18670 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18680 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
18690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
186a0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74   sqlite3Fts5Init
186b0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
186c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
186d0 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28  ENABLE_ICU.  if(
186e0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
186f0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
18700 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
18710 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64  sqlite3IcuInit(d
18720 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
18730 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18740 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28  ABLE_RTREE.  if(
18750 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
18760 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
18770 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
18780 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28  qlite3RtreeInit(
18790 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
187a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
187b0 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41  NABLE_DBSTAT_VTA
187c0 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  B.  if( !db->mal
187d0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
187e0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
187f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73   rc = sqlite3Dbs
18800 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b  tatRegister(db);
18810 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18820 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18830 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64  E_JSON1.  if( !d
18840 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18850 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18860 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18870 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29  te3Json1Init(db)
18880 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18890 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  /* -DSQLITE_DEFA
188a0 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
188b0 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49  =1 makes EXCLUSI
188c0 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  VE the default l
188d0 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
188e0 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  .  -DSQLITE_DEFA
188f0 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
18900 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74  =0 make NORMAL t
18910 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
18920 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44  ng.  ** mode.  D
18930 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20  oing nothing at 
18940 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e  all also makes N
18950 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
18960 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  t..  */.#ifdef S
18970 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
18980 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d  CKING_MODE.  db-
18990 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20  >dfltLockMode = 
189a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
189b0 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73  OCKING_MODE;.  s
189c0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
189d0 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74  ngMode(sqlite3Bt
189e0 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
189f0 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20  [0].pBt),.      
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
18a20 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29  LT_LOCKING_MODE)
18a30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
18a40 72 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f  rc ) sqlite3Erro
18a50 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a  r(db, rc);..  /*
18a60 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b   Enable the look
18a70 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62  aside-malloc sub
18a80 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75  system */.  setu
18a90 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30  pLookaside(db, 0
18aa0 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  , sqlite3GlobalC
18ab0 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
18ac0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
18ad0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18ae0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
18af0 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73  Lookaside);..  s
18b00 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
18b10 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51  heckpoint(db, SQ
18b20 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
18b30 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29  _AUTOCHECKPOINT)
18b40 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20  ;..opendb_out:. 
18b50 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61   if( db ){.    a
18b60 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78  ssert( db->mutex
18b70 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73  !=0 || isThreads
18b80 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  afe==0.         
18b90 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62    || sqlite3Glob
18ba0 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
18bb0 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
18bc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
18bd0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
18be0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
18bf0 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
18c00 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c  assert( db!=0 ||
18c10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
18c20 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  M );.  if( rc==S
18c30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
18c40 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
18c50 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
18c60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
18c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18c80 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
18c90 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
18ca0 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20  ;.  }.  *ppDb = 
18cb0 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  db;.#ifdef SQLIT
18cc0 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
18cd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
18ce0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
18cf0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  g ){.    /* Open
18d00 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e  ing a db handle.
18d10 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
18d20 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a  r is passed 0. *
18d30 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67  /.    void *pArg
18d40 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
18d50 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
18d60 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  g;.    sqlite3Gl
18d70 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
18d80 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69  og(pArg, db, zFi
18d90 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  lename, 0);.  }.
18da0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
18db0 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
18dc0 44 45 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53  DEC).  if( rc==S
18dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18de0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48 65 78  const char *zHex
18df0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  Key = sqlite3_ur
18e00 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65  i_parameter(zOpe
18e10 6e 2c 20 22 68 65 78 6b 65 79 22 29 3b 0a 20 20  n, "hexkey");.  
18e20 20 20 69 66 28 20 7a 48 65 78 4b 65 79 20 26 26    if( zHexKey &&
18e30 20 7a 48 65 78 4b 65 79 5b 30 5d 20 29 7b 0a 20   zHexKey[0] ){. 
18e40 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20       u8 iByte;. 
18e50 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
18e60 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b    char zKey[40];
18e70 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
18e80 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f  iByte=0; i<sizeo
18e90 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c  f(zKey)*2 && sql
18ea0 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 48 65  ite3Isxdigit(zHe
18eb0 78 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a  xKey[i]); i++){.
18ec0 20 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20          iByte = 
18ed0 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c  (iByte<<4) + sql
18ee0 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 48 65  ite3HexToInt(zHe
18ef0 78 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20  xKey[i]);.      
18f00 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20 29    if( (i&1)!=0 )
18f10 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79   zKey[i/2] = iBy
18f20 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
18f30 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32    sqlite3_key_v2
18f40 28 64 62 2c 20 30 2c 20 7a 4b 65 79 2c 20 69 2f  (db, 0, zKey, i/
18f50 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  2);.    }.  }.#e
18f60 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
18f70 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65  ree(zOpen);.  re
18f80 74 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a  turn rc & 0xff;.
18f90 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
18fa0 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
18fb0 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
18fc0 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
18fd0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
18fe0 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
18ff0 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
19000 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
19010 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19030 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
19040 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
19050 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
19060 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
19070 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
19080 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
19090 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
190a0 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
190b0 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
190c0 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
190d0 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
190e0 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
190f0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
19100 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
19110 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
19120 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
19130 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
19140 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
19150 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
19160 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
19170 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
19180 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
19190 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
191a0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
191b0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
191c0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
191d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
191e0 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
191f0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
19200 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
19210 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
19220 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
19230 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
19240 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
19250 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
19260 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
19270 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
19280 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
19290 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
192a0 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62  ARMOR.  if( ppDb
192b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
192c0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
192d0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20  .#endif.  *ppDb 
192e0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
192f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
19300 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
19310 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
19320 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19330 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
19340 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
19350 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30   zFilename = "\0
19360 30 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20  00\000";.  pVal 
19370 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
19380 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
19390 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
193a0 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
193b0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
193c0 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
193d0 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
193e0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
193f0 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
19400 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
19410 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
19420 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
19430 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
19440 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
19450 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
19460 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
19470 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
19480 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73  EATE, 0);.    as
19490 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72  sert( *ppDb || r
194a0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
194b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
194c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48  QLITE_OK && !DbH
194d0 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62  asProperty(*ppDb
194e0 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
194f0 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53  aded) ){.      S
19500 43 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29  CHEMA_ENC(*ppDb)
19510 20 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20   = ENC(*ppDb) = 
19520 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
19530 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  VE;.    }.  }els
19540 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
19550 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19560 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75   }.  sqlite3Valu
19570 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
19580 72 65 74 75 72 6e 20 72 63 20 26 20 30 78 66 66  return rc & 0xff
19590 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
195a0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
195b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
195c0 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
195d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
195e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
195f0 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
19600 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
19610 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
19620 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
19630 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
19640 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
19650 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
19660 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
19670 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
19680 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
19690 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ).){.  return sq
196a0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
196b0 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e  lation_v2(db, zN
196c0 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20  ame, enc, pCtx, 
196d0 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a  xCompare, 0);.}.
196e0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
196f0 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
19700 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
19710 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
19720 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
19730 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
19740 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ation_v2(.  sqli
19750 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
19760 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
19770 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
19780 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
19790 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
197a0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
197b0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
197c0 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
197d0 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74  (void*).){.  int
197e0 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
197f0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
19800 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
19810 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
19820 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30  (db) || zName==0
19830 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19840 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
19850 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
19860 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
19870 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
19880 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
19890 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
198a0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
198b0 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
198c0 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
198d0 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73   xDel);.  rc = s
198e0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
198f0 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
19900 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
19910 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
19920 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
19930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
19940 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
19950 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
19960 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
19970 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
19980 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
19990 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
199a0 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  llation16(.  sql
199b0 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
199c0 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a  st void *zName,.
199d0 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
199e0 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
199f0 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
19a00 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
19a10 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
19a20 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
19a30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
19a40 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64  r *zName8;..#ifd
19a50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19a60 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
19a70 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
19a80 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e  heckOk(db) || zN
19a90 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
19aa0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
19ab0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
19ac0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19ad0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
19ae0 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
19af0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e  ocFailed );.  zN
19b00 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74  ame8 = sqlite3Ut
19b10 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65  f16to8(db, zName
19b20 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
19b30 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28  16NATIVE);.  if(
19b40 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72   zName8 ){.    r
19b50 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
19b60 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20  ion(db, zName8, 
19b70 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
19b80 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20  Compare, 0);.   
19b90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19ba0 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a  b, zName8);.  }.
19bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
19bc0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
19bd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
19be0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
19bf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19c00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19c10 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
19c20 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
19c30 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19c40 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
19c50 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
19c60 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
19c70 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
19c80 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
19c90 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
19ca0 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
19cb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19cc0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
19cd0 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
19ce0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
19cf0 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
19d00 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29  id(*xCollNeeded)
19d10 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
19d20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
19d30 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66  st char*).){.#if
19d40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19d50 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
19d60 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
19d70 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
19d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
19d90 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
19da0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19db0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
19dc0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
19dd0 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  ded = xCollNeede
19de0 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  d;.  db->xCollNe
19df0 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62  eded16 = 0;.  db
19e00 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
19e10 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
19e20 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
19e30 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
19e40 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
19e50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
19e60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19e70 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
19e80 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
19e90 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
19ea0 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
19eb0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
19ec0 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
19ed0 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
19ee0 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
19ef0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
19f00 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
19f10 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
19f20 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c  _needed16(.  sql
19f30 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
19f40 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
19f50 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
19f60 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a  lNeeded16)(void*
19f70 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
19f80 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69  extRep,const voi
19f90 64 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  d*).){.#ifdef SQ
19fa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
19fb0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
19fc0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
19fd0 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
19fe0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
19ff0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1a000 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1a010 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
1a020 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
1a030 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  0;.  db->xCollNe
1a040 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65  eded16 = xCollNe
1a050 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43  eded16;.  db->pC
1a060 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70  ollNeededArg = p
1a070 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20  CollNeededArg;. 
1a080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1a090 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1a0a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a0b0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1a0c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1a0d0 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  16 */..#ifndef S
1a0e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
1a0f0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
1a100 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
1a110 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e   an anachronism.
1a120 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75   It used to be u
1a130 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66  sed to recover f
1a140 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28  rom a.** malloc(
1a150 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53  ) failure, but S
1a160 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74  QLite now does t
1a170 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  his automaticall
1a180 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1a190 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  3_global_recover
1a1a0 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
1a1b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1a1c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  ndif../*.** Test
1a1d0 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
1a1e0 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  or not the datab
1a1f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
1a200 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a  s in autocommit.
1a210 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e  ** mode.  Return
1a220 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61   TRUE if it is a
1a230 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
1a240 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64    Autocommit mod
1a250 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65  e is on.** by de
1a260 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  fault.  Autocomm
1a270 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62  it is disabled b
1a280 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d  y a BEGIN statem
1a290 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65  ent and reenable
1a2a0 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74  d.** by the next
1a2b0 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42   COMMIT or ROLLB
1a2c0 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ACK..*/.int sqli
1a2d0 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
1a2e0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
1a2f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a300 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1a310 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1a320 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1a330 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
1a340 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1a350 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1a360 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1a370 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  rn db->autoCommi
1a380 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
1a390 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1a3a0 65 73 20 61 72 65 20 73 75 62 73 74 69 74 75 74  es are substitut
1a3b0 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73  es for constants
1a3c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
1a3d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  .** SQLITE_MISUS
1a3e0 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
1a3f0 45 4e 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  EN, SQLITE_NOMEM
1a400 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74   and possibly ot
1a410 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e  her error.** con
1a420 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65  stants.  They se
1a430 72 76 65 20 74 77 6f 20 70 75 72 70 6f 73 65 73  rve two purposes
1a440 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65  :.**.**   1.  Se
1a450 72 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69  rve as a conveni
1a460 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74  ent place to set
1a470 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e   a breakpoint in
1a480 20 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20   a debugger.**  
1a490 20 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77       to detect w
1a4a0 68 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f  hen version erro
1a4b0 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63  r conditions occ
1a4c0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  urs..**.**   2. 
1a4d0 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
1a4e0 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65  log() to provide
1a4f0 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
1a500 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a   location where.
1a510 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c  **       a low-l
1a520 65 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69  evel error is fi
1a530 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f  rst detected..*/
1a540 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 6f  .static int repo
1a550 72 74 45 72 72 6f 72 28 69 6e 74 20 69 45 72 72  rtError(int iErr
1a560 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f  , int lineno, co
1a570 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 29  nst char *zType)
1a580 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  {.  sqlite3_log(
1a590 69 45 72 72 2c 20 22 25 73 20 61 74 20 6c 69 6e  iErr, "%s at lin
1a5a0 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
1a5b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a5c0 7a 54 79 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32  zType, lineno, 2
1a5d0 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
1a5e0 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
1a5f0 69 45 72 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  iErr;.}.int sqli
1a600 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28  te3CorruptError(
1a610 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
1a620 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1a630 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
1a640 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  g!=0 );.  return
1a650 20 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c   reportError(SQL
1a660 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e  ITE_CORRUPT, lin
1a670 65 6e 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63  eno, "database c
1a680 6f 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69  orruption");.}.i
1a690 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65  nt sqlite3Misuse
1a6a0 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1a6b0 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
1a6c0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1a6d0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1a6e0 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72  return reportErr
1a6f0 6f 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  or(SQLITE_MISUSE
1a700 2c 20 6c 69 6e 65 6e 6f 2c 20 22 6d 69 73 75 73  , lineno, "misus
1a710 65 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  e");.}.int sqlit
1a720 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28  e3CantopenError(
1a730 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
1a740 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1a750 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
1a760 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  g!=0 );.  return
1a770 20 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c   reportError(SQL
1a780 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69  ITE_CANTOPEN, li
1a790 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  neno, "cannot op
1a7a0 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66  en file");.}.#if
1a7b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1a7c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 6d 65  .int sqlite3Nome
1a7d0 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  mError(int linen
1a7e0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1a7f0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1a800 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1a810 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72   return reportEr
1a820 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ror(SQLITE_NOMEM
1a830 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29  , lineno, "OOM")
1a840 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  ;.}.int sqlite3I
1a850 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69  oerrnomemError(i
1a860 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1a870 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1a880 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1a890 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1a8a0 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1a8b0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 2c 20  TE_IOERR_NOMEM, 
1a8c0 6c 69 6e 65 6e 6f 2c 20 22 49 2f 4f 20 4f 4f 4d  lineno, "I/O OOM
1a8d0 20 65 72 72 6f 72 22 29 3b 0a 7d 0a 23 65 6e 64   error");.}.#end
1a8e0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1a8f0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
1a900 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ED./*.** This is
1a910 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72   a convenience r
1a920 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65  outine that make
1a930 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  s sure that all 
1a940 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a  thread-specific.
1a950 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  ** data for this
1a960 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e   thread has been
1a970 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a   deallocated..**
1a980 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f  .** SQLite no lo
1a990 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64  nger uses thread
1a9a0 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73  -specific data s
1a9b0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1a9c0 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  s now a.** no-op
1a9d0 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65  .  It is retaine
1a9e0 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  d for historical
1a9f0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a   compatibility..
1aa00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
1aa10 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76  thread_cleanup(v
1aa20 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oid){.}.#endif..
1aa30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74  /*.** Return met
1aa40 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  a information ab
1aa50 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63  out a specific c
1aa60 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62  olumn of a datab
1aa70 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65  ase table..** Se
1aa80 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c  e comment in sql
1aa90 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68  ite3.h (sqlite.h
1aaa0 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73  .in) for details
1aab0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1aac0 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
1aad0 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65  tadata(.  sqlite
1aae0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
1aaf0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1ab00 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ion handle */.  
1ab10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1ab20 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44  ame,        /* D
1ab30 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20  atabase name or 
1ab40 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
1ab50 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65  char *zTableName
1ab60 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e  ,     /* Table n
1ab70 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
1ab80 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  har *zColumnName
1ab90 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ,    /* Column n
1aba0 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ame */.  char co
1abb0 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65  nst **pzDataType
1abc0 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20  ,    /* OUTPUT: 
1abd0 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79  Declared data ty
1abe0 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  pe */.  char con
1abf0 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20  st **pzCollSeq, 
1ac00 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43      /* OUTPUT: C
1ac10 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1ac20 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
1ac30 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20  *pNotNull,      
1ac40 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1ac50 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e  T: True if NOT N
1ac60 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ULL constraint e
1ac70 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  xists */.  int *
1ac80 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20  pPrimaryKey,    
1ac90 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
1aca0 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
1acb0 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20   part of PK */. 
1acc0 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20   int *pAutoinc  
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ace0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
1acf0 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69  column is auto-i
1ad00 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  ncrement */.){. 
1ad10 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
1ad20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
1ad30 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
1ad40 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20  .  Column *pCol 
1ad50 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
1ad60 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
1ad70 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30  t *zDataType = 0
1ad80 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
1ad90 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20  zCollSeq = 0;.  
1ada0 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b  int notnull = 0;
1adb0 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65  .  int primaryke
1adc0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74  y = 0;.  int aut
1add0 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64  oinc = 0;...#ifd
1ade0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1adf0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1ae00 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1ae10 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54  heckOk(db) || zT
1ae20 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  ableName==0 ){. 
1ae30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ae40 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1ae50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
1ae60 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
1ae70 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
1ae80 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
1ae90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1aea0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1aeb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1aec0 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
1aed0 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
1aee0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
1aef0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1af00 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
1af10 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
1af20 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
1af30 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
1af40 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
1af50 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
1af60 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
1af70 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
1af80 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
1af90 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
1afa0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
1afb0 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
1afc0 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
1afd0 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
1afe0 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
1aff0 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61  .  if( zColumnNa
1b000 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
1b010 51 75 65 72 79 20 66 6f 72 20 65 78 69 73 74 61  Query for exista
1b020 6e 63 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c  nce of table onl
1b030 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
1b040 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
1b050 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
1b060 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43  Col++){.      pC
1b070 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
1b080 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66  [iCol];.      if
1b090 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
1b0a0 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
1b0b0 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b   zColumnName) ){
1b0c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1b0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b0e0 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62    if( iCol==pTab
1b0f0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
1b100 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
1b110 62 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 52  b) && sqlite3IsR
1b120 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  owid(zColumnName
1b130 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
1b140 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
1b150 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  .        pCol = 
1b160 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d  iCol>=0 ? &pTab-
1b170 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b  >aCol[iCol] : 0;
1b180 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b190 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
1b1a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72          goto err
1b1b0 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  or_out;.      }.
1b1c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1b1d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
1b1e0 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d  ock stores the m
1b1f0 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
1b200 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
1b210 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68  urned.  ** to th
1b220 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61  e caller in loca
1b230 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74  l variables zDat
1b240 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c  aType, zCollSeq,
1b250 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72   notnull, primar
1b260 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75  ykey.  ** and au
1b270 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70  toinc. At this p
1b280 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74  oint there are t
1b290 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  wo possibilities
1b2a0 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
1b2b0 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65   1. The specifie
1b2c0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61  d column name wa
1b2d0 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20  s rowid", "oid" 
1b2e0 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20  or "_rowid_" .  
1b2f0 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68  **        and th
1b300 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63  ere is no explic
1b310 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50  itly declared IP
1b320 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a  K column. .  **.
1b330 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20    **     2. The 
1b340 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76  table is not a v
1b350 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  iew and the colu
1b360 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69  mn name identifi
1b370 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20  ed an .  **     
1b380 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65     explicitly de
1b390 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43  clared column. C
1b3a0 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  opy meta informa
1b3b0 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e  tion from *pCol.
1b3c0 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f  .  */ .  if( pCo
1b3d0 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  l ){.    zDataTy
1b3e0 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75  pe = sqlite3Colu
1b3f0 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 30 29 3b 0a  mnType(pCol,0);.
1b400 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70      zCollSeq = p
1b410 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col->zColl;.    
1b420 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e  notnull = pCol->
1b430 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20  notNull!=0;.    
1b440 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70  primarykey  = (p
1b450 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20  Col->colFlags & 
1b460 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
1b470 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63  !=0;.    autoinc
1b480 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d   = pTab->iPKey==
1b490 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74  iCol && (pTab->t
1b4a0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
1b4b0 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a  oincrement)!=0;.
1b4c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61    }else{.    zDa
1b4d0 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45  taType = "INTEGE
1b4e0 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  R";.    primaryk
1b4f0 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  ey = 1;.  }.  if
1b500 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  ( !zCollSeq ){. 
1b510 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71     zCollSeq = sq
1b520 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
1b530 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a    }..error_out:.
1b540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b550 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f  aveAll(db);..  /
1b560 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75  * Whether the fu
1b570 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63  nction call succ
1b580 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c  eeded or failed,
1b590 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
1b5a0 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20  parameters.  ** 
1b5b0 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69  to whatever thei
1b5c0 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70  r local counterp
1b5d0 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66  arts contain. If
1b5e0 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63   an error did oc
1b5f0 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68  cur,.  ** this h
1b600 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
1b610 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74   zeroing all out
1b620 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  put parameters..
1b630 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74    */.  if( pzDat
1b640 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54  aType ) *pzDataT
1b650 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b  ype = zDataType;
1b660 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71  .  if( pzCollSeq
1b670 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20   ) *pzCollSeq = 
1b680 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20  zCollSeq;.  if( 
1b690 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74  pNotNull ) *pNot
1b6a0 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a  Null = notnull;.
1b6b0 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65    if( pPrimaryKe
1b6c0 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  y ) *pPrimaryKey
1b6d0 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20   = primarykey;. 
1b6e0 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20   if( pAutoinc ) 
1b6f0 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f  *pAutoinc = auto
1b700 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  inc;..  if( SQLI
1b710 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54  TE_OK==rc && !pT
1b720 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
1b730 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1b740 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73  Msg);.    zErrMs
1b750 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
1b760 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20  tf(db, "no such 
1b770 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73  table column: %s
1b780 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  .%s", zTableName
1b790 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d  ,.        zColum
1b7a0 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  nName);.    rc =
1b7b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1b7c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
1b7d0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
1b7e0 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30   (zErrMsg?"%s":0
1b7f0 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  ), zErrMsg);.  s
1b800 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1b810 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20   zErrMsg);.  rc 
1b820 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
1b830 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
1b840 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b850 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1b860 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b870 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
1b880 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
1b890 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
1b8a0 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
1b8b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65  .int sqlite3_sle
1b8c0 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71  ep(int ms){.  sq
1b8d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
1b8e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66  .  int rc;.  pVf
1b8f0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
1b900 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70  find(0);.  if( p
1b910 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Vfs==0 ) return 
1b920 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  0;..  /* This fu
1b930 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20  nction works in 
1b940 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75  milliseconds, bu
1b950 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  t the underlying
1b960 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a   OsSleep() .  **
1b970 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73   API uses micros
1b980 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68  econds. Hence th
1b990 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20  e 1000's..  */. 
1b9a0 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73   rc = (sqlite3Os
1b9b0 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30  Sleep(pVfs, 1000
1b9c0 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65  *ms)/1000);.  re
1b9d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b9e0 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
1b9f0 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64  ble the extended
1ba00 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a   result codes..*
1ba10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  /.int sqlite3_ex
1ba20 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
1ba30 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  des(sqlite3 *db,
1ba40 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66   int onoff){.#if
1ba50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ba60 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1ba70 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1ba80 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
1ba90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1baa0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1bab0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bac0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1bad0 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
1bae0 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
1baf0 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
1bb00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1bb10 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1bb20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bb30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
1bb40 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
1bb50 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
1bb60 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1bb70 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
1bb80 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
1bb90 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1bba0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1bbb0 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
1bbc0 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
1bbd0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1bbe0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1bbf0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1bc00 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1bc10 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1bc20 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1bc30 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1bc40 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1bc50 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1bc60 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1bc70 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65  mutex);.  pBtree
1bc80 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
1bc90 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
1bca0 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72  ame);.  if( pBtr
1bcb0 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  ee ){.    Pager 
1bcc0 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  *pPager;.    sql
1bcd0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20  ite3_file *fd;. 
1bce0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1bcf0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1bd00 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
1bd10 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
1bd20 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ree);.    assert
1bd30 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
1bd40 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50     fd = sqlite3P
1bd50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
1bd60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 64  ;.    assert( fd
1bd70 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  !=0 );.    if( o
1bd80 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
1bd90 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a  FILE_POINTER ){.
1bda0 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f        *(sqlite3_
1bdb0 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64  file**)pArg = fd
1bdc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1bdd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1bde0 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45  e if( op==SQLITE
1bdf0 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54  _FCNTL_VFS_POINT
1be00 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71  ER ){.      *(sq
1be10 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70 41 72 67  lite3_vfs**)pArg
1be20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 56   = sqlite3PagerV
1be30 66 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  fs(pPager);.    
1be40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1be50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1be60 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1be70 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52  _JOURNAL_POINTER
1be80 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
1be90 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
1bea0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 72  = sqlite3PagerJr
1beb0 6e 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  nlFile(pPager);.
1bec0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bed0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
1bee0 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  if( fd->pMethods
1bef0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1bf00 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1bf10 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
1bf20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bf30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bf40 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a  NOTFOUND;.    }.
1bf50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1bf60 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1bf70 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1bf80 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1bf90 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1bfa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
1bfb0 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74  face to the test
1bfc0 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e  ing logic..*/.in
1bfd0 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  t sqlite3_test_c
1bfe0 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e  ontrol(int op, .
1bff0 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ..){.  int rc = 
1c000 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
1c010 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
1c020 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ST.  UNUSED_PARA
1c030 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65  METER(op);.#else
1c040 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1c050 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
1c060 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
1c070 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  ){..    /*.    *
1c080 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
1c090 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
1c0a0 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  PRNG..    */.   
1c0b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1c0c0 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a  TCTRL_PRNG_SAVE:
1c0d0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1c0e0 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b  PrngSaveState();
1c0f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c100 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1c110 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73  ** Restore the s
1c120 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
1c130 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61   to the last sta
1c140 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20  te saved using. 
1c150 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e     ** PRNG_SAVE.
1c160 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68    If PRNG_SAVE h
1c170 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
1c180 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65  been called, the
1c190 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65  n.    ** this ve
1c1a0 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e  rb acts like PRN
1c1b0 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a  G_RESET..    */.
1c1c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c1d0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
1c1e0 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73  STORE: {.      s
1c1f0 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72  qlite3PrngRestor
1c200 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
1c210 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1c220 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65    /*.    ** Rese
1c230 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20  t the PRNG back 
1c240 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c  to its uninitial
1c250 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65  ized state.  The
1c260 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a   next call.    *
1c270 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e  * to sqlite3_ran
1c280 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72  domness() will r
1c290 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75  eseed the PRNG u
1c2a0 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61  sing a single ca
1c2b0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  ll.    ** to the
1c2c0 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74   xRandomness met
1c2d0 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75  hod of the defau
1c2e0 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20  lt VFS..    */. 
1c2f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1c300 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
1c310 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ET: {.      sqli
1c320 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30  te3_randomness(0
1c330 2c 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ,0);.      break
1c340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1c350 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1c360 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54  test_control(BIT
1c370 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20  VEC_TEST, size, 
1c380 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a  program).    **.
1c390 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73      ** Run a tes
1c3a0 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76  t against a Bitv
1c3b0 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a  ec object of siz
1c3c0 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20  e.  The program 
1c3d0 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  argument.    ** 
1c3e0 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  is an array of i
1c3f0 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66  ntegers that def
1c400 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20  ines the test.  
1c410 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20  Return -1 on a. 
1c420 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c     ** memory all
1c430 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30  ocation error, 0
1c440 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20   on success, or 
1c450 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20  non-zero for an 
1c460 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65  error..    ** Se
1c470 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74  e the sqlite3Bit
1c480 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29  vecBuiltinTest()
1c490 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
1c4a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
1c4b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1c4c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54  ITE_TESTCTRL_BIT
1c4d0 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20  VEC_TEST: {.    
1c4e0 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72    int sz = va_ar
1c4f0 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1c500 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76    int *aProg = v
1c510 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
1c520 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c530 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
1c540 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b  Test(sz, aProg);
1c550 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c560 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1c570 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1c580 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49  _control(FAULT_I
1c590 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63  NSTALL, xCallbac
1c5a0 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  k).    **.    **
1c5b0 20 41 72 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f   Arrange to invo
1c5c0 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 77  ke xCallback() w
1c5d0 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33 46  henever sqlite3F
1c5e0 61 75 6c 74 53 69 6d 28 29 20 69 73 20 63 61 6c  aultSim() is cal
1c5f0 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78  led,.    ** if x
1c600 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20  Callback is not 
1c610 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  NULL..    **.   
1c620 20 2a 2a 20 41 73 20 61 20 74 65 73 74 20 6f 66   ** As a test of
1c630 20 74 68 65 20 66 61 75 6c 74 20 73 69 6d 75 6c   the fault simul
1c640 61 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20 69  ator mechanism i
1c650 74 73 65 6c 66 2c 20 73 71 6c 69 74 65 33 46 61  tself, sqlite3Fa
1c660 75 6c 74 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a  ultSim(0).    **
1c670 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64   is called immed
1c680 69 61 74 65 6c 79 20 61 66 74 65 72 20 69 6e 73  iately after ins
1c690 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77 20  talling the new 
1c6a0 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 65  callback and the
1c6b0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76   return.    ** v
1c6c0 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  alue from sqlite
1c6d0 33 46 61 75 6c 74 53 69 6d 28 30 29 20 62 65 63  3FaultSim(0) bec
1c6e0 6f 6d 65 73 20 74 68 65 20 72 65 74 75 72 6e 20  omes the return 
1c6f0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
1c700 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1c710 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ()..    */.    c
1c720 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c730 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c  TRL_FAULT_INSTAL
1c740 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53  L: {.      /* MS
1c750 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75  VC is picky abou
1c760 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70  t pulling func p
1c770 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74  trs from va list
1c780 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70  s..      ** http
1c790 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f  ://support.micro
1c7a0 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36  soft.com/kb/4796
1c7b0 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  1.      ** sqlit
1c7c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1c7d0 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76  TestCallback = v
1c7e0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 28 2a 29  a_arg(ap, int(*)
1c7f0 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f  (int));.      */
1c800 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 69  .      typedef i
1c810 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b  nt(*TESTCALLBACK
1c820 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20  FUNC_t)(int);.  
1c830 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1c840 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c  lConfig.xTestCal
1c850 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61  lback = va_arg(a
1c860 70 2c 20 54 45 53 54 43 41 4c 4c 42 41 43 4b 46  p, TESTCALLBACKF
1c870 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 72 63  UNC_t);.      rc
1c880 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53   = sqlite3FaultS
1c890 69 6d 28 30 29 3b 0a 20 20 20 20 20 20 62 72 65  im(0);.      bre
1c8a0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1c8b0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1c8c0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
1c8d0 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
1c8e0 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64  KS, xBegin, xEnd
1c8f0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1c900 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74  Register hooks t
1c910 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61  o call to indica
1c920 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28  te which malloc(
1c930 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20  ) failures .    
1c940 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20  ** are benign.. 
1c950 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1c960 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1c970 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
1c980 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  KS: {.      type
1c990 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f  def void (*void_
1c9a0 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b  function)(void);
1c9b0 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
1c9c0 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69  tion xBenignBegi
1c9d0 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  n;.      void_fu
1c9e0 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e  nction xBenignEn
1c9f0 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  d;.      xBenign
1ca00 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61  Begin = va_arg(a
1ca10 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
1ca20 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  );.      xBenign
1ca30 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  End = va_arg(ap,
1ca40 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
1ca50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
1ca60 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28  nignMallocHooks(
1ca70 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42  xBenignBegin, xB
1ca80 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20  enignEnd);.     
1ca90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1caa0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1cab0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1cac0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1cad0 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  RL_PENDING_BYTE,
1cae0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29   unsigned int X)
1caf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1cb00 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  et the PENDING b
1cb10 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65  yte to the value
1cb20 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1cb30 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a  , if X>0..    **
1cb40 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
1cb50 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72   if X==0.  Retur
1cb60 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
1cb70 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a  he pending byte.
1cb80 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69      ** as it exi
1cb90 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69  sting before thi
1cba0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
1cbb0 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  lled..    **.   
1cbc0 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20   ** IMPORTANT:  
1cbd0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
1cbe0 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30  DING byte from 0
1cbf0 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74  x40000000 result
1cc00 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69  s in.    ** an i
1cc10 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61  ncompatible data
1cc20 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  base file format
1cc30 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  .  Changing the 
1cc40 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20  PENDING byte.   
1cc50 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61   ** while any da
1cc60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1cc70 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74  n is open result
1cc80 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61  s in undefined a
1cc90 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  nd.    ** delete
1cca0 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a  rious behavior..
1ccb0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ccc0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ccd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a  PENDING_BYTE: {.
1cce0 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49        rc = PENDI
1ccf0 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66  NG_BYTE;.#ifndef
1cd00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
1cd10 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1cd20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65   unsigned int ne
1cd30 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70  wVal = va_arg(ap
1cd40 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b  , unsigned int);
1cd50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  .        if( new
1cd60 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e  Val ) sqlite3Pen
1cd70 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61  dingByte = newVa
1cd80 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
1cd90 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
1cda0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1cdb0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1cdc0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1cdd0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1cde0 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
1cdf0 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
1ce00 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
1ce10 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
1ce20 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
1ce30 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  t.    ** assert(
1ce40 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74  ) was enabled at
1ce50 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
1ce60 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64  If X is true and
1ce70 20 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a   assert().    **
1ce80 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
1ce90 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
1cea0 75 65 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  ue is true.  If 
1ceb0 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20  X is true and.  
1cec0 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73    ** assert() is
1ced0 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
1cee0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1cef0 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20   is zero.  If X 
1cf00 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20  is.    ** false 
1cf10 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20  and assert() is 
1cf20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
1cf30 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65  e assertion fire
1cf40 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  s and the.    **
1cf50 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e   process aborts.
1cf60 20 20 49 66 20 58 20 69 73 20 66 61 6c 73 65 20    If X is false 
1cf70 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20  and assert() is 
1cf80 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
1cf90 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  he.    ** return
1cfa0 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a   value is zero..
1cfb0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1cfc0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cfd0 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20  ASSERT: {.      
1cfe0 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d  volatile int x =
1cff0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
1d000 28 20 2f 2a 73 69 64 65 2d 65 66 66 65 63 74 73  ( /*side-effects
1d010 2d 6f 6b 2a 2f 20 28 78 20 3d 20 76 61 5f 61 72  -ok*/ (x = va_ar
1d020 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b  g(ap,int))!=0 );
1d030 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20  .      rc = x;. 
1d040 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d050 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
1d060 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1d070 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d080 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
1d090 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
1d0a0 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
1d0b0 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
1d0c0 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
1d0d0 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20   how the ALWAYS 
1d0e0 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52  and.    ** NEVER
1d0f0 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66   macros were def
1d100 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1d110 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  time..    **.   
1d120 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76   ** The return v
1d130 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58  alue is ALWAYS(X
1d140 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ).  .    **.    
1d150 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64  ** The recommend
1d160 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e  ed test is X==2.
1d170 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1d180 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74  value is 2, that
1d190 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c   means.    ** AL
1d1a0 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
1d1b0 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f  () are both no-o
1d1c0 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
1d1d0 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  acros, which is 
1d1e0 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
1d1f0 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20  lt setting.  If 
1d200 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1d210 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41   is 1, then ALWA
1d220 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20  YS() is either. 
1d230 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64     ** hard-coded
1d240 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65   to true or else
1d250 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69   it asserts if i
1d260 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ts argument is f
1d270 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  alse..    ** The
1d280 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20   first behavior 
1d290 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74  (hard-coded to t
1d2a0 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65  rue) is the case
1d2b0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1d2c0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1d2d0 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1d2e0 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1d2f0 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  d and the second
1d300 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  .    ** behavior
1d310 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20   (assert if the 
1d320 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41  argument to ALWA
1d330 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69  YS() is false) i
1d340 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
1d350 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
1d360 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
1d370 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
1d380 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
1d390 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
1d3a0 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63  n-time test proc
1d3b0 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b  edure might look
1d3c0 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
1d3d0 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
1d3e0 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74   **    if( sqlit
1d3f0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1d400 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d410 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b  ALWAYS, 2)==2 ){
1d420 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1d430 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
1d440 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70  ER() are no-op p
1d450 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
1d460 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  os.    **    }el
1d470 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  se if( sqlite3_t
1d480 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1d490 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1d4a0 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a  RT, 1) ){.    **
1d4b0 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1d4c0 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20  x) asserts that 
1d4d0 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52  x is true. NEVER
1d4e0 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73  (x) asserts x is
1d4f0 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20   false..    **  
1d500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
1d510 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
1d520 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1d530 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20  1.  NEVER(x) is 
1d540 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20  a constant 0..  
1d550 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f    **    }.    */
1d560 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d570 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1d580 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  : {.      int x 
1d590 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1d5a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57  ;.      rc = ALW
1d5b0 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72  AYS(x);.      br
1d5c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1d5d0 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69  /*.    **   sqli
1d5e0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1d5f0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1d600 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20  _BYTEORDER);.   
1d610 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69   **.    ** The i
1d620 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20  nteger returned 
1d630 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65  reveals the byte
1d640 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f  -order of the co
1d650 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a  mputer on which.
1d660 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73      ** SQLite is
1d670 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a   running:.    **
1d680 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20  .    **       1 
1d690 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1d6a0 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1d6b0 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a   run-time.    **
1d6c0 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74        10     lit
1d6d0 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65  tle-endian, dete
1d6e0 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
1d6f0 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30  me.    **  43210
1d700 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
1d710 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
1d720 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
1d730 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20      **  123410  
1d740 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
1d750 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
1d760 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
1d770 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51   */ .    case SQ
1d780 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
1d790 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20  TEORDER: {.     
1d7a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54   rc = SQLITE_BYT
1d7b0 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c  EORDER*100 + SQL
1d7c0 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e  ITE_LITTLEENDIAN
1d7d0 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47  *10 + SQLITE_BIG
1d7e0 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72  ENDIAN;.      br
1d7f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1d800 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1d810 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1d820 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1d830 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
1d840 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1d850 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
1d860 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
1d870 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
1d880 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
1d890 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
1d8a0 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
1d8b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d8c0 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
1d8d0 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
1d8e0 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1d8f0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1d900 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
1d910 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1d920 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1d930 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1d940 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
1d950 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1d960 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
1d970 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
1d980 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1d990 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1d9a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1d9b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
1d9c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d9d0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d9e0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
1d9f0 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
1da00 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1da10 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
1da20 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
1da30 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
1da40 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
1da50 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
1da60 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
1da70 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
1da80 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
1da90 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
1daa0 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
1dab0 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
1dac0 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
1dad0 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
1dae0 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
1daf0 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
1db00 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
1db10 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
1db20 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
1db30 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
1db40 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
1db50 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
1db60 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
1db70 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
1db80 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
1db90 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
1dba0 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
1dbb0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1dbc0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
1dbd0 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
1dbe0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1dbf0 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1dc00 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64  3*);.      db->d
1dc10 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36  bOptFlags = (u16
1dc20 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  )(va_arg(ap, int
1dc30 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20  ) & 0xffff);.   
1dc40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dc50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1dc60 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20  _KEYWORD.    /* 
1dc70 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1dc80 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1dc90 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20  CTRL_ISKEYWORD, 
1dca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72  const char *zWor
1dcb0 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
1dcc0 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b   If zWord is a k
1dcd0 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65  eyword recognize
1dce0 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c  d by the parser,
1dcf0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
1dd00 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
1dd10 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  f keywords.  Or 
1dd20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20  if zWord is not 
1dd30 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72  a keyword, retur
1dd40 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  n 0..    ** .   
1dd50 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65   ** This test fe
1dd60 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76  ature is only av
1dd70 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61  ailable in the a
1dd80 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63  malgamation sinc
1dd90 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c  e.    ** the SQL
1dda0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61  ITE_N_KEYWORD ma
1ddb0 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  cro is not defin
1ddc0 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ed in this file 
1ddd0 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a  if SQLite.    **
1dde0 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20   is built using 
1ddf0 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20  separate source 
1de00 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
1de10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1de20 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
1de30 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
1de40 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61  char *zWord = va
1de50 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
1de60 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  har*);.      int
1de70 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1de80 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20  en30(zWord);.   
1de90 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33     rc = (sqlite3
1dea0 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a  KeywordCode((u8*
1deb0 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49  )zWord, n)!=TK_I
1dec0 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  D) ? SQLITE_N_KE
1ded0 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20  YWORD : 0;.     
1dee0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1def0 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71  ndif ..    /* sq
1df00 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1df10 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1df20 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43  RL_SCRATCHMALLOC
1df30 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72  , sz, &pNew, pFr
1df40 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ee);.    **.    
1df50 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69 6e  ** Pass pFree in
1df60 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  to sqlite3Scratc
1df70 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a  hFree(). .    **
1df80 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c   If sz>0 then al
1df90 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63 68  locate a scratch
1dfa0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65   buffer into pNe
1dfb0 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  w.  .    */.    
1dfc0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1dfd0 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
1dfe0 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64  OC: {.      void
1dff0 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77   *pFree, **ppNew
1e000 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
1e010 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72        sz = va_ar
1e020 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1e030 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67    ppNew = va_arg
1e040 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20  (ap, void**);.  
1e050 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61      pFree = va_a
1e060 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
1e070 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70       if( sz ) *p
1e080 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63  pNew = sqlite3Sc
1e090 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b  ratchMalloc(sz);
1e0a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63  .      sqlite3Sc
1e0b0 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65 29  ratchFree(pFree)
1e0c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e0d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1e0e0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1e0f0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1e100 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
1e110 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b  ULT, int onoff);
1e120 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1e130 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66  f parameter onof
1e140 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63  f is non-zero, c
1e150 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72 61  onfigure the wra
1e160 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c  ppers so that al
1e170 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  l.    ** subsequ
1e180 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63  ent calls to loc
1e190 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72  altime() and var
1e1a0 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f  iants fail. If o
1e1b0 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20  noff is zero,.  
1e1c0 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73    ** undo this s
1e1d0 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  etting..    */. 
1e1e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1e1f0 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
1e200 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20  E_FAULT: {.     
1e210 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1e220 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46  nfig.bLocaltimeF
1e230 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70  ault = va_arg(ap
1e240 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1e250 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1e260 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1e270 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1e280 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
1e290 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20  CORRUPT, int);. 
1e2a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1e2b0 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67   or clear a flag
1e2c0 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
1e2d0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1e2e0 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  e file is always
1e2f0 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f   well-.    ** fo
1e300 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63  rmed and never c
1e310 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c  orrupt.  This fl
1e320 61 67 20 69 73 20 63 6c 65 61 72 20 62 79 20 64  ag is clear by d
1e330 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69  efault, indicati
1e340 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64  ng that.    ** d
1e350 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69  atabase files mi
1e360 67 68 74 20 68 61 76 65 20 61 72 62 69 74 72 61  ght have arbitra
1e370 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ry corruption.  
1e380 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67  Setting the flag
1e390 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74   during.    ** t
1e3a0 65 73 74 69 6e 67 20 63 61 75 73 65 73 20 63 65  esting causes ce
1e3b0 72 74 61 69 6e 20 61 73 73 65 72 74 28 29 20 73  rtain assert() s
1e3c0 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
1e3d0 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69   code to be acti
1e3e0 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61  vated.    ** tha
1e3f0 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76  t demonstrat inv
1e400 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d  ariants on well-
1e410 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
1e420 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
1e430 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e440 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1e450 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  RUPT: {.      sq
1e460 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e470 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d  g.neverCorrupt =
1e480 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1e490 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e4a0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20     }...    /*   
1e4b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e4c0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e4d0 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41  CTRL_VDBE_COVERA
1e4e0 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  GE, xCallback, p
1e4f0 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tr);.    **.    
1e500 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20  ** Set the VDBE 
1e510 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63  coverage callbac
1e520 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43  k function to xC
1e530 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e  allback with con
1e540 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69  text .    ** poi
1e550 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f  nter ptr..    */
1e560 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e570 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1e580 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65  OVERAGE: {.#ifde
1e590 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
1e5a0 56 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70  VERAGE.      typ
1e5b0 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e  edef void (*bran
1e5c0 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69  ch_callback)(voi
1e5d0 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20  d*,int,u8,u8);. 
1e5e0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1e5f0 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72  alConfig.xVdbeBr
1e600 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  anch = va_arg(ap
1e610 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  ,branch_callback
1e620 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e630 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64  GlobalConfig.pVd
1e640 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61  beBranchArg = va
1e650 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a  _arg(ap,void*);.
1e660 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1e670 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1e680 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1e690 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1e6a0 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
1e6b0 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b  MMAP, db, nMax);
1e6c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e6d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1e6e0 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20  TER_MMAP: {.    
1e6f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e700 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1e710 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1e720 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d  nMaxSorterMmap =
1e730 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1e740 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e750 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1e760 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1e770 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1e780 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20  TRL_ISINIT);.   
1e790 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72   **.    ** Retur
1e7a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53  n SQLITE_OK if S
1e7b0 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69  QLite has been i
1e7c0 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53  nitialized and S
1e7d0 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20  QLITE_ERROR if. 
1e7e0 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a     ** not..    *
1e7f0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e800 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49  E_TESTCTRL_ISINI
1e810 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  T: {.      if( s
1e820 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e830 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72  ig.isInit==0 ) r
1e840 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1e850 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e860 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
1e870 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1e880 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1e890 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c  RL_IMPOSTER, db,
1e8a0 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20   dbName, onOff, 
1e8b0 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  tnum);.    **.  
1e8c0 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63    ** This test c
1e8d0 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74  ontrol is used t
1e8e0 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65  o create imposte
1e8f0 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20  r tables.  "db" 
1e900 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20  is a pointer.   
1e910 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
1e920 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
1e930 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64   dbName is the d
1e940 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78  atabase name (ex
1e950 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20  : "main" or.    
1e960 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63 68  ** "temp") which
1e970 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68   will receive th
1e980 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e  e imposter.  "on
1e990 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73  Off" turns impos
1e9a0 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20  ter mode on.    
1e9b0 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75  ** or off.  "tnu
1e9c0 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  m" is the root p
1e9d0 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1e9e0 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69  e to which the i
1e9f0 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74  mposter.    ** t
1ea00 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e  able should conn
1ea10 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ect..    **.    
1ea20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74  ** Enable impost
1ea30 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65  er mode only whe
1ea40 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  n the schema has
1ea50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
1ea60 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20  rsed.  Then.    
1ea70 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20  ** run a single 
1ea80 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1ea90 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72  tement to constr
1eaa0 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72  uct the imposter
1eab0 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a   table in.    **
1eac0 20 74 68 65 20 70 61 72 73 65 64 20 73 63 68 65   the parsed sche
1ead0 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69  ma.  Then turn i
1eae0 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63  mposter mode bac
1eaf0 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20  k off again..   
1eb00 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e   **.    ** If on
1eb10 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e  Off==0 and tnum>
1eb20 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
1eb30 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20   schema for all 
1eb40 64 61 74 61 62 61 73 65 73 2c 20 63 61 75 73 69  databases, causi
1eb50 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  ng.    ** the sc
1eb60 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72  hema to be repar
1eb70 73 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  sed the next tim
1eb80 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20  e it is needed. 
1eb90 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 20 20   This has the.  
1eba0 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65    ** effect of e
1ebb0 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73  rasing all impos
1ebc0 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ter tables..    
1ebd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ebe0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
1ebf0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
1ec00 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1ec10 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1ec20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1ec30 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1ec40 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62  mutex);.      db
1ec50 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c  ->init.iDb = sql
1ec60 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
1ec70 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e  b, va_arg(ap,con
1ec80 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
1ec90 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
1eca0 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73  = db->init.impos
1ecb0 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72  terTable = va_ar
1ecc0 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1ecd0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1ece0 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  m = va_arg(ap,in
1ecf0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  t);.      if( db
1ed00 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26  ->init.busy==0 &
1ed10 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  & db->init.newTn
1ed20 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  um>0 ){.        
1ed30 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
1ed40 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
1ed50 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  on(db);.      }.
1ed60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1ed70 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1ed80 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tex);.      brea
1ed90 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
1eda0 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
1edb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1edc0 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
1edd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ede0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
1edf0 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65   utility routine
1ee00 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20  , useful to VFS 
1ee10 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c  implementations,
1ee20 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20   that checks.** 
1ee30 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61  to see if a data
1ee40 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20  base file was a 
1ee50 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  URI that contain
1ee60 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75  ed a specific qu
1ee70 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ery .** paramete
1ee80 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74  r, and if so obt
1ee90 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  ains the value o
1eea0 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61  f the query para
1eeb0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
1eec0 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
1eed0 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e  ent is the filen
1eee0 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73  ame pointer pass
1eef0 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65  ed into the xOpe
1ef00 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  n().** method of
1ef10 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74   a VFS implement
1ef20 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72  ation.  The zPar
1ef30 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  am argument is t
1ef40 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
1ef50 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
1ef60 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73  r we seek.  This
1ef70 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ef80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1ef90 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61  e zParam.** para
1efa0 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73  meter if it exis
1efb0 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61  ts.  If the para
1efc0 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65  meter does not e
1efd0 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  xist, this routi
1efe0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  ne.** returns a 
1eff0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
1f000 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1f010 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1f020 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
1f030 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
1f040 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20  char *zParam){. 
1f050 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
1f060 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29  0 || zParam==0 )
1f070 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69   return 0;.  zFi
1f080 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
1f090 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
1f0a0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c  ame) + 1;.  whil
1f0b0 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  e( zFilename[0] 
1f0c0 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73  ){.    int x = s
1f0d0 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
1f0e0 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46   zParam);.    zF
1f0f0 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1f100 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1f110 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69  name) + 1;.    i
1f120 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( x==0 ) return
1f130 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   zFilename;.    
1f140 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1f150 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1f160 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d  lename) + 1;.  }
1f170 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f180 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62  /*.** Return a b
1f190 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72  oolean value for
1f1a0 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74   a query paramet
1f1b0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1f1c0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63  e3_uri_boolean(c
1f1d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1f1e0 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  name, const char
1f1f0 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44   *zParam, int bD
1f200 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  flt){.  const ch
1f210 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
1f220 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46  uri_parameter(zF
1f230 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
1f240 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c  ;.  bDflt = bDfl
1f250 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a  t!=0;.  return z
1f260 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f   ? sqlite3GetBoo
1f270 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a  lean(z, bDflt) :
1f280 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   bDflt;.}../*.**
1f290 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74   Return a 64-bit
1f2a0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
1f2b0 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
1f2c0 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  eter..*/.sqlite3
1f2d0 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75  _int64 sqlite3_u
1f2e0 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73  ri_int64(.  cons
1f2f0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1f300 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d  e,    /* Filenam
1f310 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20 78  e as passed to x
1f320 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Open */.  const 
1f330 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20  char *zParam,   
1f340 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d      /* URI param
1f350 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20  eter sought */. 
1f360 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62   sqlite3_int64 b
1f370 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65  Dflt       /* re
1f380 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65  turn if paramete
1f390 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a  r is missing */.
1f3a0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1f3b0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
1f3c0 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65  _parameter(zFile
1f3d0 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1f3e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76   sqlite3_int64 v
1f3f0 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c  ;.  if( z && sql
1f400 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
1f410 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45  4(z, &v)==SQLITE
1f420 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74  _OK ){.    bDflt
1f430 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = v;.  }.  retu
1f440 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  rn bDflt;.}../*.
1f450 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74  ** Return the Bt
1f460 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e  ree pointer iden
1f470 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d  tified by zDbNam
1f480 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
1f490 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
1f4a0 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44  .Btree *sqlite3D
1f4b0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c  bNameToBtree(sql
1f4c0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1f4d0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1f4e0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1f4f0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1f500 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
1f510 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20  >aDb[i].pBt.    
1f520 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20   && (zDbName==0 
1f530 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
1f540 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61  p(zDbName, db->a
1f550 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29 3d  Db[i].zDbSName)=
1f560 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
1f570 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b   return db->aDb[
1f580 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20  i].pBt;.    }.  
1f590 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1f5a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f5b0 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
1f5c0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1f5d0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1f5e0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
1f5f0 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
1f600 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66  ar *sqlite3_db_f
1f610 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20  ilename(sqlite3 
1f620 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1f630 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
1f640 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20  ee *pBt;.#ifdef 
1f650 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1f660 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1f670 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1f680 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1f690 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1f6a0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1f6b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
1f6c0 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
1f6d0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1f6e0 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
1f6f0 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
1f700 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
1f710 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a  ame(pBt) : 0;.}.
1f720 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
1f730 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72  if database is r
1f740 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66  ead-only or 0 if
1f750 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65   read/write.  Re
1f760 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f  turn -1 if.** no
1f770 20 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65   such database e
1f780 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
1f790 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
1f7a0 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  y(sqlite3 *db, c
1f7b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1f7c0 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
1f7d0 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
1f7e0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1f7f0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1f800 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1f810 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
1f820 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1f830 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  T;.    return -1
1f840 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
1f850 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  Bt = sqlite3DbNa
1f860 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1f870 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  bName);.  return
1f880 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74   pBt ? sqlite3Bt
1f890 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42  reeIsReadonly(pB
1f8a0 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64  t) : -1;.}..#ifd
1f8b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1f8c0 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20  _SNAPSHOT./*.** 
1f8d0 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f  Obtain a snapsho
1f8e0 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  t handle for the
1f8f0 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74   snapshot of dat
1f900 61 62 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e  abase zDb curren
1f910 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65  tly .** being re
1f920 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e  ad by handle db.
1f930 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1f940 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20  snapshot_get(.  
1f950 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
1f960 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
1f970 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
1f980 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74  hot **ppSnapshot
1f990 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1f9a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66  QLITE_ERROR;.#if
1f9b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f9c0 5f 57 41 4c 0a 20 20 69 6e 74 20 69 44 62 3b 0a  _WAL.  int iDb;.
1f9d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f9e0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1f9f0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1fa00 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1fa10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1fa20 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1fa30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
1fa40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1fa50 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
1fa60 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
1fa70 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
1fa80 62 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30  b);.  if( iDb==0
1fa90 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   || iDb>1 ){.   
1faa0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
1fab0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
1fac0 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
1fad0 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
1fae0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
1faf0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1fb00 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
1fb10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1fb20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fb30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1fb40 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
1fb50 47 65 74 28 73 71 6c 69 74 65 33 42 74 72 65 65  Get(sqlite3Btree
1fb60 50 61 67 65 72 28 70 42 74 29 2c 20 70 70 53 6e  Pager(pBt), ppSn
1fb70 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 7d  apshot);.      }
1fb80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
1fb90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1fba0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
1fbb0 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
1fbc0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
1fbd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1fbe0 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74  ** Open a read-t
1fbf0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1fc00 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65 6e 64  e snapshot idend
1fc10 69 66 69 65 64 20 62 79 20 70 53 6e 61 70 73 68  ified by pSnapsh
1fc20 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
1fc30 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e  e3_snapshot_open
1fc40 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1fc50 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1fc60 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  zDb, .  sqlite3_
1fc70 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
1fc80 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  hot.){.  int rc 
1fc90 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1fca0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fcb0 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20  MIT_WAL..#ifdef 
1fcc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1fcd0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1fce0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1fcf0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
1fd00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1fd10 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
1fd20 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1fd30 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1fd40 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
1fd50 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
1fd60 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20  {.    int iDb;. 
1fd70 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
1fd80 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
1fd90 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
1fda0 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a  ==0 || iDb>1 ){.
1fdb0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
1fdc0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1fdd0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 30  pBt;.      if( 0
1fde0 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ==sqlite3BtreeIs
1fdf0 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74 29  InReadTrans(pBt)
1fe00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1fe10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61   sqlite3PagerSna
1fe20 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65  pshotOpen(sqlite
1fe30 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
1fe40 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20  , pSnapshot);.  
1fe50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1fe60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fe70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fe80 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1fe90 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
1fea0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1feb0 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c  SnapshotOpen(sql
1fec0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
1fed0 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Bt), 0);.       
1fee0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fef0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
1ff00 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1ff10 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20  mutex);.#endif  
1ff20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1ff30 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  WAL */.  return 
1ff40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
1ff50 65 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e  e a snapshot han
1ff60 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  dle obtained fro
1ff70 6d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  m sqlite3_snapsh
1ff80 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69  ot_get()..*/.voi
1ff90 64 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  d sqlite3_snapsh
1ffa0 6f 74 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f  ot_free(sqlite3_
1ffb0 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
1ffc0 68 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  hot){.  sqlite3_
1ffd0 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b  free(pSnapshot);
1ffe0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1fff0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
20000 48 4f 54 20 2a 2f 0a                             HOT */.