/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 17cfc8ba39fd86bc8201213140db53a65ff3cf2a:


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 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1b00: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1b10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b30: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1b40: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1b50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b60: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1b70: 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c  If rc is not SQL
1b80: 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70  ITE_OK at this p
1b90: 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65  oint, then eithe
1ba0: 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  r the malloc.  *
1bb0: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c  * subsystem coul
1bc0: 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  d not be initial
1bd0: 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79 73 74  ized or the syst
1be0: 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c  em failed to all
1bf0: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
1c00: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1c10: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1c20: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
1c30: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1c40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1c60: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1c70: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1c80: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1c90: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1ca0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
1cb0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1cc0: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
1cd0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
1ce0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1cf0: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
1d00: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1d10: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1d20: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1d30: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1d40: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1d50: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1d60: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1d70: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1d80: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1d90: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  ossible..  **.  
1da0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1db0: 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37  N-OF: R-00140-37
1dc0: 34 34 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  445 SQLite autom
1dd0: 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69  atically seriali
1de0: 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  zes calls.  ** t
1df0: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1e00: 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74  od, so the xInit
1e10: 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74   method need not
1e20: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a   be threadsafe..
1e30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
1e40: 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73  llowing mutex is
1e50: 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   what serializes
1e60: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 61   access to the a
1e70: 70 70 64 65 66 20 70 63 61 63 68 65 20 78 49 6e  ppdef pcache xIn
1e80: 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e  it.  ** methods.
1e90: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63    The sqlite3_pc
1ea0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e  ache_methods.xIn
1eb0: 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65  it() all is embe
1ec0: 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  dded in the.  **
1ed0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ee0: 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65  PcacheInitialize
1ef0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
1f00: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1f10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f20: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1f40: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1f50: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
1f60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1f70: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
1f80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1f90: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d  fig.inProgress =
1fa0: 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
1fb0: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
1fc0: 20 20 20 20 7b 0a 20 20 20 20 20 20 65 78 74 65      {.      exte
1fd0: 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  rn void sqlite3_
1fe0: 69 6e 69 74 5f 73 71 6c 6c 6f 67 28 76 6f 69 64  init_sqllog(void
1ff0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2000: 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67 28 29 3b 0a  _init_sqllog();.
2010: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2020: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
2030: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
2040: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
2050: 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  te3BuiltinFuncti
2060: 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ons));.    sqlit
2070: 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
2080: 6e 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20  nFunctions();.  
2090: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
20a0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
20b0: 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  heInit==0 ){.   
20c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20d0: 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28  cacheInitialize(
20e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2100: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
2110: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2120: 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20  acheInit = 1;.  
2130: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2140: 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a  OsInit();.    }.
2150: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2160: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
2170: 71 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66  qlite3PCacheBuff
2180: 65 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33  erSetup( sqlite3
2190: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
21a0: 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  ge, .          s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74  ig.szPage, sqlit
21d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
21e0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Page);.      sql
21f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2200: 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66  .isInit = 1;.#if
2210: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2220: 5f 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e  _INIT.      bRun
2230: 45 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23  ExtraInit = 1;.#
2240: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
2250: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2260: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d  fig.inProgress =
2270: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
2280: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
2290: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
22a0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a  g.pInitMutex);..
22b0: 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64    /* Go back und
22c0: 65 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75  er the static mu
22d0: 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70  tex and clean up
22e0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20   the recursive. 
22f0: 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65   ** mutex to pre
2300: 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20  vent a resource 
2310: 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  leak..  */.  sql
2320: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2330: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c  (pMaster);.  sql
2340: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2350: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d  .nRefInitMutex--
2360: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ;.  if( sqlite3G
2370: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
2380: 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a  InitMutex<=0 ){.
2390: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
23a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
23b0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30  nRefInitMutex==0
23c0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
23d0: 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74  mutex_free(sqlit
23e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
23f0: 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20  InitMutex);.    
2400: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2410: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d  fig.pInitMutex =
2420: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
2430: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
2440: 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  aster);..  /* Th
2450: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a  e following is j
2460: 75 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65  ust a sanity che
2470: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
2480: 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20  SQLite has.  ** 
2490: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f  been compiled co
24a0: 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20  rrectly.  It is 
24b0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e  important to run
24c0: 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a   this code, but.
24d0: 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
24e0: 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f  nt to run it too
24f0: 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20   often and soak 
2500: 75 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f  up CPU cycles fo
2510: 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e  r no.  ** reason
2520: 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20  .  So we run it 
2530: 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74  once during init
2540: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  ialization..  */
2550: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2570: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
2580: 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63  NT.  /* This sec
2590: 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f  tion of code's o
25a0: 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20  nly "output" is 
25b0: 76 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61  via assert() sta
25c0: 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66  tements. */.  if
25d0: 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ( rc==SQLITE_OK
25e0: 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20   ){.    u64 x = 
25f0: 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31  (((u64)1)<<63)-1
2600: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a  ;.    double y;.
2610: 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
2620: 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73  f(x)==8);.    as
2630: 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d  sert(sizeof(x)==
2640: 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20  sizeof(y));.    
2650: 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38  memcpy(&y, &x, 8
2660: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
2670: 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29  qlite3IsNaN(y) )
2680: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e  ;.  }.#endif.#en
2690: 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74  dif..  /* Do ext
26a0: 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ra initializatio
26b0: 6e 20 73 74 65 70 73 20 72 65 71 75 65 73 74 65  n steps requeste
26c0: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
26d0: 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20  EXTRA_INIT.  ** 
26e0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
26f0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ion..  */.#ifdef
2700: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e   SQLITE_EXTRA_IN
2710: 49 54 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74  IT.  if( bRunExt
2720: 72 61 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e  raInit ){.    in
2730: 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  t SQLITE_EXTRA_I
2740: 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  NIT(const char*)
2750: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2760: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b  E_EXTRA_INIT(0);
2770: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
2780: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2790: 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65  ** Undo the effe
27a0: 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  cts of sqlite3_i
27b0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75  nitialize().  Mu
27c0: 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  st not be called
27d0: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20   while.** there 
27e0: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
27f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2800: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2810: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a  llocations or.**
2820: 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20   while any part 
2830: 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68  of SQLite is oth
2840: 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e  erwise in use in
2850: 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68   any thread.  Th
2860: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
2870: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e   not threadsafe.
2880: 20 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65    But it is safe
2890: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20   to invoke this 
28a0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68  routine.** on wh
28b0: 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  en SQLite is alr
28c0: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20  eady shut down. 
28d0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
28e0: 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a  ready shut down.
28f0: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
2900: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tine is invoked,
2910: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2920: 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
2930: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
2940: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
2950: 76 6f 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51  void){.#ifdef SQ
2960: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
2970: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2980: 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20  _wsd_init(4096, 
2990: 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  24);.  if( rc!=S
29a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
29c0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c  endif..  if( sql
29d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
29e0: 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65  .isInit ){.#ifde
29f0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53  f SQLITE_EXTRA_S
2a00: 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64  HUTDOWN.    void
2a10: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48   SQLITE_EXTRA_SH
2a20: 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20  UTDOWN(void);.  
2a30: 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53    SQLITE_EXTRA_S
2a40: 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69  HUTDOWN();.#endi
2a50: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73  f.    sqlite3_os
2a60: 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  _end();.    sqli
2a70: 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65  te3_reset_auto_e
2a80: 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20  xtension();.    
2a90: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2aa0: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  fig.isInit = 0;.
2ab0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
2ac0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2ad0: 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20  PCacheInit ){.  
2ae0: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
2af0: 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73  hutdown();.    s
2b00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2b10: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2b20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2b30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2b40: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2b50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
2b60: 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73  llocEnd();.    s
2b70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2b80: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2b90: 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2ba0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f  LITE_OMIT_SHUTDO
2bb0: 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20  WN_DIRECTORIES. 
2bc0: 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73     /* The heap s
2bd0: 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77  ubsystem has now
2be0: 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61   been shutdown a
2bf0: 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  nd these values 
2c00: 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20  are supposed.   
2c10: 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f   ** to be NULL o
2c20: 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72  r point to memor
2c30: 79 20 74 68 61 74 20 77 61 73 20 6f 62 74 61 69  y that was obtai
2c40: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2c50: 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a  _malloc(),.    *
2c60: 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65  * which would re
2c70: 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20  ly on that heap 
2c80: 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65  subsystem; there
2c90: 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  fore, make sure 
2ca0: 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c  these.    ** val
2cb0: 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72  ues cannot refer
2cc0: 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20   to heap memory 
2cd0: 74 68 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e  that was just in
2ce0: 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74  validated when t
2cf0: 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73  he.    ** heap s
2d00: 75 62 73 79 73 74 65 6d 20 77 61 73 20 73 68 75  ubsystem was shu
2d10: 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20  tdown.  This is 
2d20: 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65  only done if the
2d30: 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f   current call to
2d40: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
2d50: 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69  ction resulted i
2d60: 6e 20 74 68 65 20 68 65 61 70 20 73 75 62 73 79  n the heap subsy
2d70: 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65  stem actually be
2d80: 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20  ing shutdown..  
2d90: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2da0: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2db0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2dc0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
2dd0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  = 0;.#endif.  }.
2de0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2df0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
2e00: 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  xInit ){.    sql
2e10: 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a  ite3MutexEnd();.
2e20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2e30: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2e40: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nit = 0;.  }..  
2e50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2e70: 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69  API allows appli
2e80: 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66  cations to modif
2e90: 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e  y the global con
2ea0: 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a  figuration of.**
2eb0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
2ec0: 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ary at run-time.
2ed0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ee0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
2ef0: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
2f00: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
2f10: 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62  tanding.** datab
2f20: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
2f30: 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  or memory alloca
2f40: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75  tions.  This rou
2f50: 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74  tine is not.** t
2f60: 68 72 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c  hreadsafe.  Fail
2f70: 75 72 65 20 74 6f 20 68 65 65 64 20 74 68 65 73  ure to heed thes
2f80: 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c  e warnings can l
2f90: 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74  ead to unpredict
2fa0: 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72  able.** behavior
2fb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2fc0: 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20  _config(int op, 
2fd0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2fe0: 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ap;.  int rc = S
2ff0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
3000: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
3010: 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51   shall return SQ
3020: 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69  LITE_MISUSE if i
3030: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69  t is invoked whi
3040: 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69  le.  ** the SQLi
3050: 74 65 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e  te library is in
3060: 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73   use. */.  if( s
3070: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3080: 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75  ig.isInit ) retu
3090: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
30a0: 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61  _BKPT;..  va_sta
30b0: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
30c0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
30d0: 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67   /* Mutex config
30e0: 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
30f0: 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  are only availab
3100: 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73 61  le in a threadsa
3110: 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  fe.    ** compil
3120: 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65  e..    */.#if de
3130: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
3140: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
3150: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
3160: 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36   /* IMP: R-54466
3170: 2d 34 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61  -46756 */.    ca
3180: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3190: 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b  _SINGLETHREAD: {
31a0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
31b0: 43 45 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31  CE-OF: R-02748-1
31c0: 39 30 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e  9096 This option
31d0: 20 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64   sets the thread
31e0: 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20  ing mode to.    
31f0: 20 20 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65    ** Single-thre
3200: 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ad. */.      sql
3210: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3220: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b  .bCoreMutex = 0;
3230: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74    /* Disable mut
3240: 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20  ex on core */.  
3250: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3260: 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
3270: 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61  ex = 0;  /* Disa
3280: 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e  ble mutex on con
3290: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  nections */.    
32a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
32b0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
32c0: 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  d(SQLITE_THREADS
32d0: 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  AFE) && SQLITE_T
32e0: 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49  HREADSAFE>0 /* I
32f0: 4d 50 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38  MP: R-20520-5408
3300: 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  6 */.    case SQ
3310: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54  LITE_CONFIG_MULT
3320: 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20  ITHREAD: {.     
3330: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3340: 20 52 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54   R-14374-42468 T
3350: 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20  his option sets 
3360: 74 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f  the threading mo
3370: 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d  de to.      ** M
3380: 75 6c 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a  ulti-thread. */.
3390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
33a0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
33b0: 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e  utex = 1;  /* En
33c0: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
33d0: 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  re */.      sqli
33e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
33f0: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20  bFullMutex = 0; 
3400: 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65   /* Disable mute
3410: 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  x on connections
3420: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
3430: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
3440: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3450: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
3460: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3470: 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39  E>0 /* IMP: R-59
3480: 35 39 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20  593-21810 */.   
3490: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
34a0: 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20  FIG_SERIALIZED: 
34b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
34c0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d  NCE-OF: R-41220-
34d0: 35 31 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f  51800 This optio
34e0: 6e 20 73 65 74 73 20 74 68 65 20 74 68 72 65 61  n sets the threa
34f0: 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20  ding mode to.   
3500: 20 20 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64     ** Serialized
3510: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3530: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20  CoreMutex = 1;  
3540: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
3550: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
3560: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3570: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
3580: 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20  = 1;  /* Enable 
3590: 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74  mutex on connect
35a0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  ions */.      br
35b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
35c0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
35d0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29  LITE_THREADSAFE)
35e0: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
35f0: 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20  DSAFE>0 /* IMP: 
3600: 52 2d 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f  R-63666-48755 */
3610: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3620: 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b  _CONFIG_MUTEX: {
3630: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
3640: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
3650: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
3660: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
3670: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3680: 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61  ig.mutex = *va_a
3690: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
36a0: 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  utex_methods*);.
36b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36c0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
36d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
36e0: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
36f0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
3700: 2f 2a 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d  /* IMP: R-14450-
3710: 33 37 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73  37597 */.    cas
3720: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3730: 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20  GETMUTEX: {.    
3740: 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68    /* Retrieve th
3750: 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20  e current mutex 
3760: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
3770: 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  /.      *va_arg(
3780: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
3790: 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  x_methods*) = sq
37a0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
37b0: 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62  g.mutex;.      b
37c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
37d0: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
37e0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
37f0: 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  C: {.      /* EV
3800: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
3810: 39 34 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c  94-21030 The SQL
3820: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
3830: 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  C option takes a
3840: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
3850: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
3860: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
3870: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
3880: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  he.      ** sqli
3890: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
38a0: 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 61  structure. The a
38b0: 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65  rgument specifie
38c0: 73 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20  s alternative.  
38d0: 20 20 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c      ** low-level
38e0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
38f0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62  on routines to b
3900: 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  e used in place 
3910: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20  of the memory.  
3920: 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f      ** allocatio
3930: 6e 20 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74  n routines built
3940: 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f   into SQLite. */
3950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3960: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a  obalConfig.m = *
3970: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3980: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29  e3_mem_methods*)
3990: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
39a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
39b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
39c0: 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f  ALLOC: {.      /
39d0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
39e0: 2d 35 31 32 31 33 2d 34 36 34 31 34 20 54 68 65  -51213-46414 The
39f0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
3a00: 45 54 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20  ETMALLOC option 
3a10: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
3a20: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
3a30: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
3a40: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
3a50: 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ce of the.      
3a60: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  ** sqlite3_mem_m
3a70: 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72 65  ethods structure
3a80: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65  . The sqlite3_me
3a90: 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74  m_methods struct
3aa0: 75 72 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ure is.      ** 
3ab0: 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
3ac0: 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
3ad0: 64 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  d memory allocat
3ae0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f  ion routines. */
3af0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3b00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3b10: 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71  .xMalloc==0 ) sq
3b20: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
3b30: 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f  lt();.      *va_
3b40: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3b50: 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  mem_methods*) = 
3b60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3b70: 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65  fig.m;.      bre
3b80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3b90: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3ba0: 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20  _MEMSTATUS: {.  
3bb0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3bc0: 4f 46 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35  OF: R-61275-3515
3bd0: 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  7 The SQLITE_CON
3be0: 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70  FIG_MEMSTATUS op
3bf0: 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20  tion takes.     
3c00: 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d   ** single argum
3c10: 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c  ent of type int,
3c20: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
3c30: 61 20 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68  a boolean, which
3c40: 20 65 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a   enables.      *
3c50: 2a 20 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68  * or disables th
3c60: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20  e collection of 
3c70: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c80: 6e 20 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f  n statistics. */
3c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3ca0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
3cb0: 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tat = va_arg(ap,
3cc0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3cd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3ce0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3cf0: 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20  _SCRATCH: {.    
3d00: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d10: 3a 20 52 2d 30 38 34 30 34 2d 36 30 38 38 37 20  : R-08404-60887 
3d20: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
3d30: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
3d40: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
3d50: 46 49 47 5f 53 43 52 41 54 43 48 3a 20 41 20 70  FIG_SCRATCH: A p
3d60: 6f 69 6e 74 65 72 20 61 6e 20 38 2d 62 79 74 65  ointer an 8-byte
3d70: 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20   aligned memory 
3d80: 62 75 66 66 65 72 20 66 72 6f 6d 0a 20 20 20 20  buffer from.    
3d90: 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 73    ** which the s
3da0: 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f  cratch allocatio
3db0: 6e 73 20 77 69 6c 6c 20 62 65 20 64 72 61 77 6e  ns will be drawn
3dc0: 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65 61  , the size of ea
3dd0: 63 68 20 73 63 72 61 74 63 68 0a 20 20 20 20 20  ch scratch.     
3de0: 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 28   ** allocation (
3df0: 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  sz), and the max
3e00: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
3e10: 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f  cratch allocatio
3e20: 6e 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20  ns (N). */.     
3e30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3e40: 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20  nfig.pScratch = 
3e50: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
3e60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3e70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
3e80: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
3e90: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3ea0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3eb0: 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d 20 76  fig.nScratch = v
3ec0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3ed0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3ee0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3ef0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
3f00: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
3f10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
3f20: 38 37 36 31 2d 33 36 36 30 31 20 54 68 65 72 65  8761-36601 There
3f30: 20 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d   are three argum
3f40: 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ents to.      **
3f50: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3f60: 41 47 45 43 41 43 48 45 3a 20 41 20 70 6f 69 6e  AGECACHE: A poin
3f70: 74 65 72 20 74 6f 20 38 2d 62 79 74 65 20 61 6c  ter to 8-byte al
3f80: 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 28 70 4d  igned memory (pM
3f90: 65 6d 29 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  em),.      ** th
3fa0: 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68 20 70  e size of each p
3fb0: 61 67 65 20 63 61 63 68 65 20 6c 69 6e 65 20 28  age cache line (
3fc0: 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d  sz), and the num
3fd0: 62 65 72 20 6f 66 20 63 61 63 68 65 20 6c 69 6e  ber of cache lin
3fe0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 28 4e 29 2e  es.      ** (N).
3ff0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
4000: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
4010: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
4020: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
4030: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4040: 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61  ig.szPage = va_a
4050: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4060: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4070: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76  Config.nPage = v
4080: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
40a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
40b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
40c0: 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20  _HDRSZ: {.      
40d0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
40e0: 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68  R-39100-27317 Th
40f0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4100: 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74  PCACHE_HDRSZ opt
4110: 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20  ion takes.      
4120: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61  ** a single para
4130: 6d 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61  meter which is a
4140: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
4150: 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65  nteger and write
4160: 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  s into.      ** 
4170: 74 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65  that integer the
4180: 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   number of extra
4190: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
41a0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
41b0: 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  h page.      ** 
41c0: 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  in SQLITE_CONFIG
41d0: 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20  _PAGECACHE. */. 
41e0: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
41f0: 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20   int*) = .      
4200: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4210: 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20  rSizeBtree() +. 
4220: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4230: 48 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65  HeaderSizePcache
4240: 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73  () +.          s
4250: 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65  qlite3HeaderSize
4260: 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20  Pcache1();.     
4270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4280: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4290: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
42a0: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
42b0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
42c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
42d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
42e0: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
42f0: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
4300: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
4310: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
4320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4330: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4340: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
4350: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
4360: 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34  CE-OF: R-63325-4
4370: 38 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f  8378 The SQLITE_
4380: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f  CONFIG_PCACHE2 o
4390: 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20  ption takes a.  
43a0: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72      ** single ar
43b0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
43c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
43d0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
43e0: 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a  ethods2.      **
43f0: 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62   object. This ob
4400: 6a 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74  ject specifies t
4410: 68 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  he interface to 
4420: 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61  a custom page ca
4430: 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  che.      ** imp
4440: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  lementation. */.
4450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4460: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
4470: 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  2 = *va_arg(ap, 
4480: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
4490: 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20  ethods2*);.     
44a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
44b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
44c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a  NFIG_GETPCACHE2:
44d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
44e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35  ENCE-OF: R-22035
44f0: 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54  -46182 The SQLIT
4500: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43  E_CONFIG_GETPCAC
4510: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
4520: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
4530: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
4540: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
4550: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
4560: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
4570: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51     ** object. SQ
4580: 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Lite copies of t
4590: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
45a0: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
45b0: 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20  tion into.      
45c0: 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20  ** that object. 
45d0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
45e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
45f0: 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d  .pcache2.xInit==
4600: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
4610: 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66  ite3PCacheSetDef
4620: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a  ault();.      }.
4630: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
4640: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
4650: 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71  _methods2*) = sq
4660: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4670: 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20  g.pcache2;.     
4680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f   break;.    }../
4690: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
46a0: 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65  -06626-12911 The
46b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
46c0: 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e  EAP option is on
46d0: 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ly.** available 
46e0: 69 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  if SQLite is com
46f0: 70 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65  piled with eithe
4700: 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  r SQLITE_ENABLE_
4710: 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51  MEMSYS3 or.** SQ
4720: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
4730: 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20  YS5 and returns 
4740: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
4750: 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73  invoked otherwis
4760: 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e. */.#if define
4770: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
4780: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
4790: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
47a0: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
47b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
47c0: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
47d0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
47e0: 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68  R-19854-42126 Th
47f0: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72  ere are three ar
4800: 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20  guments to.     
4810: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
4820: 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74  G_HEAP: An 8-byt
4830: 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65  e aligned pointe
4840: 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c  r to the memory,
4850: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75   the.      ** nu
4860: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
4870: 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66   the memory buff
4880: 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69  er, and the mini
4890: 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  mum allocation s
48a0: 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
48b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
48c0: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20  lConfig.pHeap = 
48d0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
48e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
48f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
4900: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
4910: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4930: 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61  mnReq = va_arg(a
4940: 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20  p, int);..      
4950: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4960: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20  lConfig.mnReq<1 
4970: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4990: 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  nReq = 1;.      
49a0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
49b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
49c0: 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20  Req>(1<<12) ){. 
49d0: 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69         /* cap mi
49e0: 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61  n request size a
49f0: 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20  t 2^12 */.      
4a00: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4a10: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31  onfig.mnReq = (1
4a20: 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  <<12);.      }..
4a30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4a40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
4a50: 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eap==0 ){.      
4a60: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4a70: 3a 20 52 2d 34 39 39 32 30 2d 36 30 31 38 39 20  : R-49920-60189 
4a80: 49 66 20 74 68 65 20 66 69 72 73 74 20 70 6f 69  If the first poi
4a90: 6e 74 65 72 20 28 74 68 65 20 6d 65 6d 6f 72 79  nter (the memory
4aa0: 20 70 6f 69 6e 74 65 72 29 0a 20 20 20 20 20 20   pointer).      
4ab0: 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68    ** is NULL, th
4ac0: 65 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72 74  en SQLite revert
4ad0: 73 20 74 6f 20 75 73 69 6e 67 20 69 74 73 20 64  s to using its d
4ae0: 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c  efault memory al
4af0: 6c 6f 63 61 74 6f 72 0a 20 20 20 20 20 20 20 20  locator.        
4b00: 2a 2a 20 28 74 68 65 20 73 79 73 74 65 6d 20 6d  ** (the system m
4b10: 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e  alloc() implemen
4b20: 74 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67  tation), undoing
4b30: 20 61 6e 79 20 70 72 69 6f 72 20 69 6e 76 6f 63   any prior invoc
4b40: 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 20  ation of.       
4b50: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
4b60: 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20 20 20  G_MALLOC..      
4b70: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
4b80: 53 65 74 74 69 6e 67 20 73 71 6c 69 74 65 33 47  Setting sqlite3G
4b90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f  lobalConfig.m to
4ba0: 20 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c 6c 20   all zeros will 
4bb0: 63 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a  cause malloc to.
4bc0: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 76 65 72          ** rever
4bd0: 74 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74  t to its default
4be0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
4bf0: 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69  when sqlite3_ini
4c00: 74 69 61 6c 69 7a 65 28 29 20 69 73 20 72 75 6e  tialize() is run
4c10: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
4c20: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69      memset(&sqli
4c30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4c40: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c  m, 0, sizeof(sql
4c50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4c60: 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  .m));.      }els
4c70: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
4c80: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 30  IDENCE-OF: R-610
4c90: 30 36 2d 30 38 39 31 38 20 49 66 20 74 68 65 20  06-08918 If the 
4ca0: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 69  memory pointer i
4cb0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4cc0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  the.        ** a
4cd0: 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72  lternative memor
4ce0: 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65  y allocator is e
4cf0: 6e 67 61 67 65 64 20 74 6f 20 68 61 6e 64 6c 65  ngaged to handle
4d00: 20 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65 73 0a   all of SQLites.
4d10: 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 6f 72          ** memor
4d20: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65  y allocation nee
4d30: 64 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ds. */.#ifdef SQ
4d40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
4d50: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
4d60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4d70: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
4d80: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
4d90: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4da0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
4db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4dc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
4dd0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
4de0: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
4df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4e00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4e10: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
4e20: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
4e30: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
4e40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4e50: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
4e60: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e80: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
4e90: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
4ea0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4eb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4ec0: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61  .    /* Record a
4ed0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4ee0: 6c 6f 67 67 65 72 20 66 75 6e 63 74 69 6f 6e 20  logger function 
4ef0: 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72  and its first ar
4f00: 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54  gument..    ** T
4f10: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55  he default is NU
4f20: 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20  LL.  Logging is 
4f30: 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20  disabled if the 
4f40: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
4f50: 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e   is.    ** NULL.
4f60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4f70: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
4f80: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d  OG: {.      /* M
4f90: 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f  SVC is picky abo
4fa0: 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20  ut pulling func 
4fb0: 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73  ptrs from va lis
4fc0: 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74  ts..      ** htt
4fd0: 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72  p://support.micr
4fe0: 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39  osoft.com/kb/479
4ff0: 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  61.      ** sqli
5000: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5010: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
5020: 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c  , void(*)(void*,
5030: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
5040: 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  );.      */.    
5050: 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a    typedef void(*
5060: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5070: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
5080: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5090: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
50a0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c  g = va_arg(ap, L
50b0: 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20  OGFUNC_t);.     
50c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
50d0: 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76  nfig.pLogArg = v
50e0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
50f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5100: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 49     }..    /* EVI
5110: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 34  DENCE-OF: R-5554
5120: 38 2d 33 33 38 31 37 20 54 68 65 20 63 6f 6d 70  8-33817 The comp
5130: 69 6c 65 2d 74 69 6d 65 20 73 65 74 74 69 6e 67  ile-time setting
5140: 20 66 6f 72 20 55 52 49 20 66 69 6c 65 6e 61 6d   for URI filenam
5150: 65 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  es.    ** can be
5160: 20 63 68 61 6e 67 65 64 20 61 74 20 73 74 61 72   changed at star
5170: 74 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68 65  t-time using the
5180: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
5190: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
51a0: 4e 46 49 47 5f 55 52 49 2c 31 29 20 6f 72 0a 20  NFIG_URI,1) or. 
51b0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
51c0: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
51d0: 49 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66 69 67  IG_URI,0) config
51e0: 75 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20  uration calls.. 
51f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5200: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
5210: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
5220: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34 35  DENCE-OF: R-2545
5230: 31 2d 36 31 31 32 35 20 54 68 65 20 53 51 4c 49  1-61125 The SQLI
5240: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70  TE_CONFIG_URI op
5250: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
5260: 67 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 67  gle.      ** arg
5270: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e  ument of type in
5280: 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t. If non-zero, 
5290: 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e  then URI handlin
52a0: 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20  g is globally.  
52b0: 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
52c0: 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
52d0: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 55   is zero, then U
52e0: 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67  RI handling is g
52f0: 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  lobally.      **
5300: 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20   disabled. */.  
5310: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5320: 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
5330: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
5340: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5350: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
5360: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43   SQLITE_CONFIG_C
5370: 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43  OVERING_INDEX_SC
5380: 41 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AN: {.      /* E
5390: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36  VIDENCE-OF: R-36
53a0: 35 39 32 2d 30 32 37 37 32 20 54 68 65 20 53 51  592-02772 The SQ
53b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45  LITE_CONFIG_COVE
53c0: 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 0a  RING_INDEX_SCAN.
53d0: 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20        ** option 
53e0: 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69  takes a single i
53f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20  nteger argument 
5400: 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
5410: 65 74 65 64 20 61 73 20 61 0a 20 20 20 20 20 20  eted as a.      
5420: 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72  ** boolean in or
5430: 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72  der to enable or
5440: 20 64 69 73 61 62 6c 65 20 74 68 65 20 75 73 65   disable the use
5450: 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   of covering ind
5460: 69 63 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a  ices for.      *
5470: 2a 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * full table sca
5480: 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  ns in the query 
5490: 6f 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20  optimizer. */.  
54a0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
54b0: 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 20  lConfig.bUseCis 
54c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
54d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
54e0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
54f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
5500: 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  OG.    case SQLI
5510: 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
5520: 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
5530: 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55  f void(*SQLLOGFU
5540: 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c  NC_t)(void*, sql
5550: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
5560: 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  r*, int);.      
5570: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5580: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61  fig.xSqllog = va
5590: 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46  _arg(ap, SQLLOGF
55a0: 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71  UNC_t);.      sq
55b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
55c0: 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76  g.pSqllogArg = v
55d0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20 2a  a_arg(ap, void *
55e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
55f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5600: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5610: 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  NFIG_MMAP_SIZE: 
5620: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
5630: 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36 33 2d  NCE-OF: R-58063-
5640: 33 38 32 35 38 20 53 51 4c 49 54 45 5f 43 4f 4e  38258 SQLITE_CON
5650: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20 74 61  FIG_MMAP_SIZE ta
5660: 6b 65 73 20 74 77 6f 20 36 34 2d 62 69 74 0a 20  kes two 64-bit. 
5670: 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20       ** integer 
5680: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
5690: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
56a0: 74 68 65 20 64 65 66 61 75 6c 74 20 6d 6d 61 70  the default mmap
56b0: 20 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20 20 20   size limit.    
56c0: 20 20 2a 2a 20 28 74 68 65 20 64 65 66 61 75 6c    ** (the defaul
56d0: 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 50 52  t setting for PR
56e0: 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 29 20  AGMA mmap_size) 
56f0: 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
5700: 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 2a 2a  allowed.      **
5710: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
5720: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
5730: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20  e3_int64 szMmap 
5740: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
5750: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20  ite3_int64);.   
5760: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
5770: 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67   mxMmap = va_arg
5780: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  (ap, sqlite3_int
5790: 36 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  64);.      /* EV
57a0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 33  IDENCE-OF: R-533
57b0: 36 37 2d 34 33 31 39 30 20 49 66 20 65 69 74 68  67-43190 If eith
57c0: 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  er argument to t
57d0: 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a 20 20  his option is.  
57e0: 20 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 2c      ** negative,
57f0: 20 74 68 65 6e 20 74 68 61 74 20 61 72 67 75 6d   then that argum
5800: 65 6e 74 20 69 73 20 63 68 61 6e 67 65 64 20 74  ent is changed t
5810: 6f 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d 74 69  o its compile-ti
5820: 6d 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20  me default..    
5830: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
5840: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39  IDENCE-OF: R-349
5850: 39 33 2d 34 35 30 33 31 20 54 68 65 20 6d 61 78  93-45031 The max
5860: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d 61  imum allowed mma
5870: 70 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 0a 20  p size will be. 
5880: 20 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79       ** silently
5890: 20 74 72 75 6e 63 61 74 65 64 20 69 66 20 6e 65   truncated if ne
58a0: 63 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20  cessary so that 
58b0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65  it does not exce
58c0: 65 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ed the.      ** 
58d0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 78  compile-time max
58e0: 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 73  imum mmap size s
58f0: 65 74 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  et by the SQLITE
5900: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20  _MAX_MMAP_SIZE. 
5910: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d       ** compile-
5920: 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 20  time option..   
5930: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
5940: 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d  mxMmap<0 || mxMm
5950: 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  ap>SQLITE_MAX_MM
5960: 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  AP_SIZE ){.     
5970: 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49     mxMmap = SQLI
5980: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
59a0: 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73  if( szMmap<0 ) s
59b0: 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
59c0: 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
59d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  ;.      if( szMm
59e0: 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61  ap>mxMmap) szMma
59f0: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a00: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a10: 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d  onfig.mxMmap = m
5a20: 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  xMmap;.      sql
5a30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5a40: 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  .szMmap = szMmap
5a50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5a60: 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45     }..#if SQLITE
5a70: 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e  _OS_WIN && defin
5a80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5a90: 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20  MALLOC) /* IMP: 
5aa0: 52 2d 30 34 37 38 30 2d 35 35 38 31 35 20 2a 2f  R-04780-55815 */
5ab0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ac0: 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45  _CONFIG_WIN32_HE
5ad0: 41 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  APSIZE: {.      
5ae0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
5af0: 52 2d 33 34 39 32 36 2d 30 33 33 36 30 20 53 51  R-34926-03360 SQ
5b00: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33  LITE_CONFIG_WIN3
5b10: 32 5f 48 45 41 50 53 49 5a 45 20 74 61 6b 65 73  2_HEAPSIZE takes
5b20: 20 61 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20   a 32-bit.      
5b30: 2a 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  ** unsigned inte
5b40: 67 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 73  ger value that s
5b50: 70 65 63 69 66 69 65 73 20 74 68 65 20 6d 61 78  pecifies the max
5b60: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65  imum size of the
5b70: 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a   created.      *
5b80: 2a 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20  * heap. */.     
5b90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5ba0: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
5bb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
5bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5bd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
5be0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5bf0: 50 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73  PMASZ: {.      s
5c00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5c10: 69 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72  ig.szPma = va_ar
5c20: 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
5c30: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
5c40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66  ;.    }..    def
5c50: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
5c60: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
5c70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5c80: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
5c90: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
5ca0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
5cb0: 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  up the lookaside
5cc0: 20 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64   buffers for a d
5cd0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5ce0: 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  on..** Return SQ
5cf0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
5d00: 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b  ss.  .** If look
5d10: 61 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79  aside is already
5d20: 20 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20   active, return 
5d30: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a  SQLITE_BUSY..**.
5d40: 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65  ** The sz parame
5d50: 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ter is the numbe
5d60: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61  r of bytes in ea
5d70: 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f  ch lookaside slo
5d80: 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61  t..** The cnt pa
5d90: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
5da0: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20  umber of slots. 
5db0: 20 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55   If pStart is NU
5dc0: 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  LL the.** space 
5dd0: 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  for the lookasid
5de0: 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61  e memory is obta
5df0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
5e00: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  3_malloc()..** I
5e10: 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20  f pStart is not 
5e20: 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20  NULL then it is 
5e30: 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20  sz*cnt bytes of 
5e40: 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f  memory to use fo
5e50: 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69  r.** the lookasi
5e60: 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  de memory..*/.st
5e70: 61 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f  atic int setupLo
5e80: 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20  okaside(sqlite3 
5e90: 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  *db, void *pBuf,
5ea0: 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74   int sz, int cnt
5eb0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
5ec0: 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45  E_OMIT_LOOKASIDE
5ed0: 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b  .  void *pStart;
5ee0: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
5ef0: 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20  side.nOut ){.   
5f00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
5f10: 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72  USY;.  }.  /* Fr
5f20: 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ee any existing 
5f30: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
5f40: 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65   for this handle
5f50: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c   before.  ** all
5f60: 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e  ocating a new on
5f70: 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61  e so we don't ha
5f80: 76 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65  ve to have space
5f90: 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20   for .  ** both 
5fa0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
5fb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
5fc0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
5fd0: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
5fe0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
5ff0: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
6000: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a    }.  /* The siz
6010: 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65  e of a lookaside
6020: 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55 4e   slot after ROUN
6030: 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f 20  DDOWN8 needs to 
6040: 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74  be larger.  ** t
6050: 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  han a pointer to
6060: 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f   be useful..  */
6070: 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57  .  sz = ROUNDDOW
6080: 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a  N8(sz);  /* IMP:
6090: 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a   R-33038-09382 *
60a0: 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74  /.  if( sz<=(int
60b0: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
60c0: 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30  eSlot*) ) sz = 0
60d0: 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20  ;.  if( cnt<0 ) 
60e0: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  cnt = 0;.  if( s
60f0: 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29  z==0 || cnt==0 )
6100: 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20  {.    sz = 0;.  
6110: 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20    pStart = 0;.  
6120: 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d 3d  }else if( pBuf==
6130: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
6140: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
6150: 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20  c();.    pStart 
6160: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
6170: 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49   sz*cnt );  /* I
6180: 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37 32  MP: R-61949-3572
6190: 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  7 */.    sqlite3
61a0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
61b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  );.    if( pStar
61c0: 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74 65  t ) cnt = sqlite
61d0: 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61  3MallocSize(pSta
61e0: 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b  rt)/sz;.  }else{
61f0: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 42  .    pStart = pB
6200: 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f  uf;.  }.  db->lo
6210: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d  okaside.pStart =
6220: 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c   pStart;.  db->l
6230: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
6240: 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73   0;.  db->lookas
6250: 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a  ide.sz = (u16)sz
6260: 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74 20 29  ;.  if( pStart )
6270: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
6280: 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a   LookasideSlot *
6290: 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  p;.    assert( s
62a0: 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28  z > (int)sizeof(
62b0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
62c0: 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  );.    p = (Look
62d0: 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72  asideSlot*)pStar
62e0: 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74  t;.    for(i=cnt
62f0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
6300: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
6310: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6320: 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Free;.      db->
6330: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
6340: 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28  = p;.      p = (
6350: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26  LookasideSlot*)&
6360: 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20  ((u8*)p)[sz];.  
6370: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b    }.    db->look
6380: 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a  aside.pEnd = p;.
6390: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
63a0: 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 30 3b 0a  e.bDisable = 0;.
63b0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
63c0: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42  e.bMalloced = pB
63d0: 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65  uf==0 ?1:0;.  }e
63e0: 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  lse{.    db->loo
63f0: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20  kaside.pStart = 
6400: 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  db;.    db->look
6410: 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64 62 3b  aside.pEnd = db;
6420: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6430: 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 31 3b  de.bDisable = 1;
6440: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6450: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30  de.bMalloced = 0
6460: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
6470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
6480: 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74 75 72  ASIDE */.  retur
6490: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
64a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
64b0: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
64c0: 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
64d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
64e0: 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  .sqlite3_mutex *
64f0: 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78  sqlite3_db_mutex
6500: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
6510: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6520: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
6530: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
6540: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
6550: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
6560: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
6570: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6580: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
6590: 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f   db->mutex;.}../
65a0: 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20  *.** Free up as 
65b0: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77  much memory as w
65c0: 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67  e can from the g
65d0: 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  iven database.**
65e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
65f0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  int sqlite3_db_r
6600: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71  elease_memory(sq
6610: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
6620: 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  t i;..#ifdef SQL
6630: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
6640: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
6650: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
6660: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
6670: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
6680: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
6690: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
66a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c  b->mutex);.  sql
66b0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
66c0: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
66d0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
66e0: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
66f0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
6700: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
6710: 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  ){.      Pager *
6720: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
6730: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b  BtreePager(pBt);
6740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
6750: 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72  gerShrink(pPager
6760: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
6770: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
6780: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
6790: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
67a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
67b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
67c0: 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
67d0: 79 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  y dirty pages in
67e0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
67f0: 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63 68 65   for any attache
6800: 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 6f  d database.** to
6810: 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
6820: 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c  lite3_db_cachefl
6830: 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ush(sqlite3 *db)
6840: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
6850: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6860: 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75 73 79  .  int bSeenBusy
6870: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
6880: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
6890: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
68a0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
68b0: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
68c0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
68d0: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
68e0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
68f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
6900: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
6910: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
6920: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
6930: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
6940: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
6950: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
6960: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6970: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
6980: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
6990: 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  ){.      Pager *
69a0: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
69b0: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b  BtreePager(pBt);
69c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
69d0: 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 70 50  te3PagerFlush(pP
69e0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
69f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
6a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65 65   ){.        bSee
6a10: 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20  nBusy = 1;.     
6a20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6a30: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
6a40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
6a50: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
6a60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6a70: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6a80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 72 63  );.  return ((rc
6a90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
6aa0: 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51 4c 49  SeenBusy) ? SQLI
6ab0: 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b 0a 7d  TE_BUSY : rc);.}
6ac0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
6ad0: 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66  ation settings f
6ae0: 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c  or an individual
6af0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6b00: 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  tion.*/.int sqli
6b10: 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71  te3_db_config(sq
6b20: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f  lite3 *db, int o
6b30: 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  p, ...){.  va_li
6b40: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b  st ap;.  int rc;
6b50: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
6b60: 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
6b70: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
6b80: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f  LITE_DBCONFIG_LO
6b90: 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20  OKASIDE: {.     
6ba0: 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61   void *pBuf = va
6bb0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
6bc0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35   /* IMP: R-26835
6bd0: 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20  -10964 */.      
6be0: 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
6bf0: 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20  ap, int);       
6c00: 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d  /* IMP: R-47871-
6c10: 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69  25994 */.      i
6c20: 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28  nt cnt = va_arg(
6c30: 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f  ap, int);      /
6c40: 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35  * IMP: R-04460-5
6c50: 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63  3386 */.      rc
6c60: 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64   = setupLookasid
6c70: 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20  e(db, pBuf, sz, 
6c80: 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  cnt);.      brea
6c90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
6ca0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74  ault: {.      st
6cb0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
6cc0: 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t {.        int 
6cd0: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op;      /* The 
6ce0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
6cf0: 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f    u32 mask;    /
6d00: 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69  * Mask of the bi
6d10: 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61  t in sqlite3.fla
6d20: 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20  gs to set/clear 
6d30: 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67  */.      } aFlag
6d40: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
6d50: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
6d60: 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20  IG_ENABLE_FKEY, 
6d70: 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67     SQLITE_Foreig
6d80: 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20  nKeys    },.    
6d90: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
6da0: 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49  ONFIG_ENABLE_TRI
6db0: 47 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61  GGER, SQLITE_Ena
6dc0: 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20  bleTrigger  },. 
6dd0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e       };.      un
6de0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
6df0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6e00: 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52  ERROR; /* IMP: R
6e10: 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a  -42790-23372 */.
6e20: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6e30: 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67  <ArraySize(aFlag
6e40: 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Op); i++){.     
6e50: 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69     if( aFlagOp[i
6e60: 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20  ].op==op ){.    
6e70: 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20        int onoff 
6e80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
6e90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
6ea0: 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28   *pRes = va_arg(
6eb0: 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
6ec0: 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67       int oldFlag
6ed0: 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
6ee0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f           if( ono
6ef0: 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>0 ){.        
6f00: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
6f10: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
6f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
6f30: 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29  e if( onoff==0 )
6f40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  {.            db
6f50: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61  ->flags &= ~aFla
6f60: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  gOp[i].mask;.   
6f70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6f80: 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21     if( oldFlags!
6f90: 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20  =db->flags ){.  
6fa0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6fb0: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
6fc0: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
6fd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6fe0: 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b       if( pRes ){
6ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52  .            *pR
7000: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
7010: 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73  & aFlagOp[i].mas
7020: 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  k)!=0;.         
7030: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
7040: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
7050: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7060: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7080: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
7090: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
70a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
70b0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62  rn true if the b
70c0: 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  uffer z[0..n-1] 
70d0: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61  contains all spa
70e0: 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ces..*/.static i
70f0: 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e  nt allSpaces(con
7100: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
7110: 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  n){.  while( n>0
7120: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20   && z[n-1]==' ' 
7130: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75  ){ n--; }.  retu
7140: 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn n==0;.}../*.*
7150: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65  * This is the de
7160: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
7170: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
7180: 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73  BINARY" which is
7190: 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c   always.** avail
71a0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
71b0: 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d  he padFlag argum
71c0: 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ent is not NULL 
71d0: 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69  then space paddi
71e0: 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a  ng at the end.**
71f0: 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69   of strings is i
7200: 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d  gnored.  This im
7210: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52  plements the RTR
7220: 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f  IM collation..*/
7230: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43  .static int binC
7240: 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20  ollFunc(.  void 
7250: 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20  *padFlag,.  int 
7260: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
7270: 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
7280: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
7290: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
72a0: 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e  t rc, n;.  n = n
72b0: 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65  Key1<nKey2 ? nKe
72c0: 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a  y1 : nKey2;.  /*
72d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
72e0: 36 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20  65033-28449 The 
72f0: 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20  built-in BINARY 
7300: 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72  collation compar
7310: 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  es.  ** strings 
7320: 62 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69  byte by byte usi
7330: 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20  ng the memcmp() 
7340: 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68  function from th
7350: 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a  e standard C.  *
7360: 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20  * library. */.  
7370: 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79  rc = memcmp(pKey
7380: 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20  1, pKey2, n);.  
7390: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
73a0: 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20   if( padFlag.   
73b0: 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28    && allSpaces((
73c0: 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c  (char*)pKey1)+n,
73d0: 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26   nKey1-n).     &
73e0: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
73f0: 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b  ar*)pKey2)+n, nK
7400: 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20  ey2-n).    ){.  
7410: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
7420: 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37 33  OF: R-31624-2473
7430: 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65 20  7 RTRIM is like 
7440: 42 49 4e 41 52 59 20 65 78 63 65 70 74 20 74 68  BINARY except th
7450: 61 74 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a  at extra.      *
7460: 2a 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20  * spaces at the 
7470: 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73 74  end of either st
7480: 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e  ring do not chan
7490: 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20 49  ge the result. I
74a0: 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  n other.      **
74b0: 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73 20   words, strings 
74c0: 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71 75  will compare equ
74d0: 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  al to one anothe
74e0: 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65  r as long as the
74f0: 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65  y.      ** diffe
7500: 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75  r only in the nu
7510: 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73 20 61  mber of spaces a
7520: 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20 20  t the end..     
7530: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
7540: 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20       rc = nKey1 
7550: 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20  - nKey2;.    }. 
7560: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7570: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72  }../*.** Another
7580: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
7590: 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f  ing sequence: NO
75a0: 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  CASE. .**.** Thi
75b0: 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  s collating sequ
75c0: 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64  ence is intended
75d0: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
75e0: 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e  "case independen
75f0: 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22  t.** comparison"
7600: 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c  . SQLite's knowl
7610: 65 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e  edge of upper an
7620: 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75  d lower case equ
7630: 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65  ivalents.** exte
7640: 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20  nds only to the 
7650: 32 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73  26 characters us
7660: 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73  ed in the Englis
7670: 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a  h language..**.*
7680: 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20  * At the moment 
7690: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
76a0: 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61  UTF-8 implementa
76b0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
76c0: 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74  int nocaseCollat
76d0: 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20  ingFunc(.  void 
76e0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20  *NotUsed,.  int 
76f0: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
7700: 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
7710: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
7720: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
7730: 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t r = sqlite3Str
7740: 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f  NICmp(.      (co
7750: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31  nst char *)pKey1
7760: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
7770: 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b  pKey2, (nKey1<nK
7780: 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32  ey2)?nKey1:nKey2
7790: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
77a0: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
77b0: 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20    if( 0==r ){.  
77c0: 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79    r = nKey1-nKey
77d0: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
77e0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
77f0: 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  rn the ROWID of 
7800: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
7810: 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65  insert.*/.sqlite
7820: 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c  _int64 sqlite3_l
7830: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
7840: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
7850: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7860: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
7870: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
7880: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
7890: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
78a0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
78b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
78c0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
78d0: 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a   db->lastRowid;.
78e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
78f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
7900: 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73  anges in the mos
7910: 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f  t recent call to
7920: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
7930: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7940: 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  changes(sqlite3 
7950: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
7960: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
7970: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
7980: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
7990: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
79a0: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
79b0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
79c0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
79d0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
79e0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
79f0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
7a00: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
7a10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
7a20: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
7a30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7a40: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
7a50: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
7a60: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
7a70: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
7a80: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
7a90: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
7aa0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
7ab0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
7ac0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
7ad0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
7ae0: 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a  ->nTotalChange;.
7af0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
7b00: 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
7b10: 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
7b20: 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74  n only manipulat
7b30: 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  es fields of the
7b40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
7b50: 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64  dle object, it d
7b60: 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e  oes not close an
7b70: 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
7b80: 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a  t may be open.**
7b90: 20 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70   at the b-tree/p
7ba0: 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76  ager level..*/.v
7bb0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  oid sqlite3Close
7bc0: 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74  Savepoints(sqlit
7bd0: 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65  e3 *db){.  while
7be0: 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  ( db->pSavepoint
7bf0: 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e   ){.    Savepoin
7c00: 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53  t *pTmp = db->pS
7c10: 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62  avepoint;.    db
7c20: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
7c30: 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Tmp->pNext;.    
7c40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7c50: 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64  , pTmp);.  }.  d
7c60: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->nSavepoint = 
7c70: 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0;.  db->nStatem
7c80: 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69  ent = 0;.  db->i
7c90: 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
7ca0: 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  point = 0;.}../*
7cb0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64  .** Invoke the d
7cc0: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
7cd0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
7ce0: 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66  th FuncDef p, if
7cf0: 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a   any. Except,.**
7d00: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
7d10: 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66  the last copy of
7d20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64   the function, d
7d30: 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e  o not invoke it.
7d40: 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70   Multiple.** cop
7d50: 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ies of a single 
7d60: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65  function are cre
7d70: 61 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65  ated when create
7d80: 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63  _function() is c
7d90: 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51  alled.** with SQ
7da0: 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20  LITE_ANY as the 
7db0: 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61  encoding..*/.sta
7dc0: 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f  tic void functio
7dd0: 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33  nDestroy(sqlite3
7de0: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
7df0: 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  ){.  FuncDestruc
7e00: 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72  tor *pDestructor
7e10: 20 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72 75 63   = p->u.pDestruc
7e20: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
7e30: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
7e40: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
7e50: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
7e60: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
7e70: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
7e80: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
7e90: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
7ea0: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
7eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7ec0: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
7ed0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7ee0: 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20   Disconnect all 
7ef0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a  sqlite3_vtab obj
7f00: 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ects that belong
7f10: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e   to database con
7f20: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54  nection.** db. T
7f30: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
7f40: 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67 20 63  en db is being c
7f50: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
7f60: 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74   void disconnect
7f70: 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20  AllVtab(sqlite3 
7f80: 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  *db){.#ifndef SQ
7f90: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7fa0: 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a  LTABLE.  int i;.
7fb0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
7fc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
7fd0: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
7fe0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
7ff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d   i++){.    Schem
8000: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
8010: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[i].pSchema;
8020: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
8030: 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [i].pSchema ){. 
8040: 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74       for(p=sqlit
8050: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
8060: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70  ema->tblHash); p
8070: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
8080: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(p)){.        
8090: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
80a0: 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  able *)sqliteHas
80b0: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
80c0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
80d0: 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56  pTab) ) sqlite3V
80e0: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
80f0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  , pTab);.      }
8100: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8110: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
8120: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
8130: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
8140: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d  hNext(p)){.    M
8150: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
8160: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
8170: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69  shData(p);.    i
8180: 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  f( pMod->pEpoTab
8190: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
81a0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
81b0: 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  db, pMod->pEpoTa
81c0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
81d0: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
81e0: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
81f0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
8200: 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55  l(db);.#else.  U
8210: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
8220: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  db);.#endif.}../
8230: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8240: 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   if database con
8250: 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75  nection db has u
8260: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
8270: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
8280: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
8290: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
82a0: 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61  bjects.  .*/.sta
82b0: 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69  tic int connecti
82c0: 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33  onIsBusy(sqlite3
82d0: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *db){.  int j;.
82e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
82f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8300: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
8310: 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74   db->pVdbe ) ret
8320: 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30  urn 1;.  for(j=0
8330: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
8340: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
8350: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  t = db->aDb[j].p
8360: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
8370: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
8380: 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29  sInBackup(pBt) )
8390: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
83a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
83b0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
83c0: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
83d0: 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  abase.*/.static 
83e0: 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  int sqlite3Close
83f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
8400: 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a  t forceZombie){.
8410: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
8420: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
8430: 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43   R-63257-11740 C
8440: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63  alling sqlite3_c
8450: 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a  lose() or.    **
8460: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
8470: 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  2() with a NULL 
8480: 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74  pointer argument
8490: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
84a0: 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74  o-op. */.    ret
84b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
84c0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
84d0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
84e0: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
84f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
8500: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
8510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8520: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8530: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69  ..  /* Force xDi
8540: 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f  sconnect calls o
8550: 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  n all virtual ta
8560: 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e  bles */.  discon
8570: 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b  nectAllVtab(db);
8580: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
8590: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
85a0: 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41   the disconnectA
85b0: 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62  llVtab() call ab
85c0: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
85d0: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
85e0: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
85f0: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
8600: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
8610: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
8620: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
8630: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
8640: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
8650: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
8660: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
8670: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
8680: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
8690: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
86a0: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
86b0: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
86c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
86d0: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
86e0: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
86f0: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
8700: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
8710: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8720: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ack(db);..  /* L
8730: 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28  egacy behavior (
8740: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8750: 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20  behavior) is to 
8760: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
8770: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63  TE_BUSY if the c
8780: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f  onnection can no
8790: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
87a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
87b0: 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65  if( !forceZombie
87c0: 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   && connectionIs
87d0: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
87e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
87f0: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
8800: 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  USY, "unable to 
8810: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
8820: 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20  inalized ".     
8830: 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72    "statements or
8840: 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b   unfinished back
8850: 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ups");.    sqlit
8860: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8870: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
8880: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
8890: 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  Y;.  }..#ifdef S
88a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
88b0: 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
88c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
88d0: 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
88e0: 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64  Closing the hand
88f0: 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
8900: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
8910: 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20  he value 2. */. 
8920: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
8930: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73  Config.xSqllog(s
8940: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
8950: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64  ig.pSqllogArg, d
8960: 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65  b, 0, 2);.  }.#e
8970: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  ndif..  /* Conve
8980: 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rt the connectio
8990: 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20  n into a zombie 
89a0: 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  and then close i
89b0: 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  t..  */.  db->ma
89c0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
89d0: 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c  IC_ZOMBIE;.  sql
89e0: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
89f0: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29  dCloseZombie(db)
8a00: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8a10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8a20: 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e  wo variations on
8a30: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
8a40: 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e  rface for closin
8a50: 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
8a60: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
8a70: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8a80: 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20  version returns 
8a90: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
8aa0: 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f  ** leaves the co
8ab0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20  nnection option 
8ac0: 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66  if there are unf
8ad0: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
8ae0: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
8af0: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
8b00: 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20  lite3_backups.  
8b10: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
8b20: 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f  e_v2().** versio
8b30: 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e  n forces the con
8b40: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d  nection to becom
8b50: 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68  e a zombie if th
8b60: 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f  ere are.** unclo
8b70: 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61  sed resources, a
8b80: 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20  nd arranges for 
8b90: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65  deallocation whe
8ba0: 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72  n the last.** pr
8bb0: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20  epare statement 
8bc0: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
8bd0: 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74  p closes..*/.int
8be0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
8bf0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c00: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c10: 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71  (db,0); }.int sq
8c20: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73  lite3_close_v2(s
8c30: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c40: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c50: 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a  (db,1); }.../*.*
8c60: 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  * Close the mute
8c70: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f  x on database co
8c80: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a  nnection db..**.
8c90: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
8ca0: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
8cb0: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a  ection db is a z
8cc0: 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74  ombie (meaning t
8cd0: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73  hat there.** has
8ce0: 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61   been a prior ca
8cf0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ll to sqlite3_cl
8d00: 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74  ose(db) or sqlit
8d10: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29  e3_close_v2(db))
8d20: 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71   and.** every sq
8d30: 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e  lite3_stmt has n
8d40: 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  ow been finalize
8d50: 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69  d and every sqli
8d60: 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a  te3_backup has.*
8d70: 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e  * finished, then
8d80: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
8d90: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
8da0: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8db0: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c  dCloseZombie(sql
8dc0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
8dd0: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8df0: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
8e00: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
8e10: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
8e20: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73  re outstanding s
8e30: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73  qlite3_stmt or s
8e40: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
8e50: 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66  jects.  ** or if
8e60: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8e70: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
8e80: 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74   closed by sqlit
8e90: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20  e3_close_v2(),. 
8ea0: 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65   ** then just le
8eb0: 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ave the mutex an
8ec0: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
8ed0: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d   if( db->magic!=
8ee0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
8ef0: 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f  BIE || connectio
8f00: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
8f10: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
8f20: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8f30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8f40: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
8f50: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
8f60: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
8f70: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
8f80: 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20  ection has.  ** 
8f90: 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74  closed all sqlit
8fa0: 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69  e3_stmt and sqli
8fb0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8fc0: 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a  ts and has been.
8fd0: 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73    ** passed to s
8fe0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65  qlite3_close (me
8ff0: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  aning that it is
9000: 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65   a zombie).  The
9010: 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20  refore,.  ** go 
9020: 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61  ahead and free a
9030: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ll resources..  
9040: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  */..  /* If a tr
9050: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
9060: 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  n, roll it back.
9070: 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72   This also ensur
9080: 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20  es that if.  ** 
9090: 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68  any database sch
90a0: 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d  emas have been m
90b0: 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e  odified by an un
90c0: 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
90d0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20  ction.  ** they 
90e0: 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74  are reset. And t
90f0: 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64  hat the required
9100: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
9110: 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20   held to make.  
9120: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c  ** the pager rol
9130: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
9140: 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63   reset an atomic
9150: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20   operation. */. 
9160: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
9170: 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
9180: 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61  K);..  /* Free a
9190: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
91a0: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
91b0: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
91c0: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
91d0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  (db);..  /* Clos
91e0: 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  e all database c
91f0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
9200: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
9210: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
9220: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
9230: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
9240: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
9250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9260: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
9270: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
9280: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
9290: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
92a0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
92b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
92c0: 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20  .  }.  /* Clear 
92d0: 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20  the TEMP schema 
92e0: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c  separately and l
92f0: 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ast */.  if( db-
9300: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
9310: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63  ){.    sqlite3Sc
9320: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
9330: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
9340: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
9350: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
9360: 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68  .  /* Free up th
9370: 65 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c  e array of auxil
9380: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a  iary databases *
9390: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  /.  sqlite3Colla
93a0: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
93b0: 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
93c0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20  db->nDb<=2 );.  
93d0: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d  assert( db->aDb=
93e0: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
93f0: 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65  ;..  /* Tell the
9400: 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e   code in notify.
9410: 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  c that the conne
9420: 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  ction no longer 
9430: 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c  holds any.  ** l
9440: 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f  ocks and does no
9450: 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75  t require any fu
9460: 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  rther unlock-not
9470: 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
9480: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e   */.  sqlite3Con
9490: 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62  nectionClosed(db
94a0: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  );..  for(i=sqli
94b0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
94c0: 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71  >aFunc); i; i=sq
94d0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
94e0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
94f0: 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20  Next, *p;.    p 
9500: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
9510: 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  (i);.    do{.   
9520: 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72     functionDestr
9530: 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  oy(db, p);.     
9540: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
9550: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
9560: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
9570: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
9580: 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b      }while( p );
9590: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
95a0: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75  shClear(&db->aFu
95b0: 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  nc);.  for(i=sql
95c0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
95d0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
95e0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
95f0: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
9600: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
9610: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
9620: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
9630: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
9640: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
9650: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
9660: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
9670: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
9680: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
9690: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
96a0: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
96b0: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
96c0: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
96d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
96e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
96f0: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
9700: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
9710: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
9720: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
9730: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9740: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
9750: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9760: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
9770: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9780: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
9790: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
97a0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
97b0: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
97c0: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
97d0: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
97e0: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
97f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9800: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
9810: 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d  ableClear(db, pM
9820: 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  od);.    sqlite3
9830: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
9840: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
9850: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
9860: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
9870: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
9880: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f  b, SQLITE_OK); /
9890: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
98a0: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
98b0: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
98c0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
98d0: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
98e0: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
98f0: 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54  s(db);.#if SQLIT
9900: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
9910: 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f  ATION.  sqlite3_
9920: 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41  free(db->auth.zA
9930: 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69  uthUser);.  sqli
9940: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74  te3_free(db->aut
9950: 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64  h.zAuthPW);.#end
9960: 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  if..  db->magic 
9970: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
9980: 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  RROR;..  /* The 
9990: 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63  temp-database sc
99a0: 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  hema is allocate
99b0: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  d differently fr
99c0: 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68  om the other sch
99d0: 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ema.  ** objects
99e0: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61   (using sqliteMa
99f0: 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c  lloc() directly,
9a00: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
9a10: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29  te3BtreeSchema()
9a20: 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65  )..  ** So it ne
9a30: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
9a40: 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20  here. Todo: Why 
9a50: 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d  not roll the tem
9a60: 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20  p schema into.  
9a70: 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69  ** the same sqli
9a80: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68  teMalloc() as th
9a90: 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63  e one that alloc
9aa0: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
9ab0: 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  e .  ** structur
9ac0: 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e?.  */.  sqlite
9ad0: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
9ae0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
9af0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9b00: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9b10: 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  );.  db->magic =
9b20: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
9b30: 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OSED;.  sqlite3_
9b40: 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d  mutex_free(db->m
9b50: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
9b60: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
9b70: 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61  Out==0 );  /* Fa
9b80: 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69  ils on a lookasi
9b90: 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a  de memory leak *
9ba0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
9bb0: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
9bc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
9bd0: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
9be0: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
9bf0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
9c00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
9c10: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
9c20: 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69  e files.  If tri
9c30: 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
9c40: 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20  ITE_OK, then.** 
9c50: 61 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  any write cursor
9c60: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
9c70: 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61  d ("tripped" - a
9c80: 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61  s in "tripping a
9c90: 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61   circuit.** brea
9ca0: 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74  ker") and made t
9cb0: 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64  o return tripCod
9cc0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
9cd0: 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74  ny further.** at
9ce0: 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68  tempts to use th
9cf0: 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64  at cursor.  Read
9d00: 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20   cursors remain 
9d10: 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a  open and valid.*
9d20: 2a 20 62 75 74 20 61 72 65 20 22 73 61 76 65 64  * but are "saved
9d30: 22 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 61  " in case the ta
9d40: 62 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f  ble pages are mo
9d50: 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76  ved around..*/.v
9d60: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
9d70: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
9d80: 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  db, int tripCode
9d90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
9da0: 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  t inTrans = 0;. 
9db0: 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67   int schemaChang
9dc0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
9dd0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9de0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
9df0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
9e00: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f  gnMalloc();..  /
9e10: 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74  * Obtain all b-t
9e20: 72 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f  ree mutexes befo
9e30: 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61  re making any ca
9e40: 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c  lls to BtreeRoll
9e50: 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68  back(). .  ** Th
9e60: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
9e70: 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e  in case the tran
9e80: 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f  saction being ro
9e90: 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20  lled back has.  
9ea0: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ** modified the 
9eb0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
9ec0: 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d   If the b-tree m
9ed0: 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74  utexes are not t
9ee0: 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20  aken.  ** here, 
9ef0: 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61  then another sha
9f00: 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63  red-cache connec
9f10: 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b  tion might sneak
9f20: 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a   in between.  **
9f30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f   the database ro
9f40: 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d  llback and schem
9f50: 61 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63  a reset, which c
9f60: 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20  an cause false. 
9f70: 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72   ** corruption r
9f80: 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63  eports in some c
9f90: 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69  ases.  */.  sqli
9fa0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
9fb0: 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68  (db);.  schemaCh
9fc0: 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ange = (db->flag
9fd0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
9fe0: 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20  nChanges)!=0 && 
9ff0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
a000: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
a010: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
a020: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
a030: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
a040: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
a050: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
a060: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
a070: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
a080: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
a090: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a0a0: 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70  Rollback(p, trip
a0b0: 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61  Code, !schemaCha
a0c0: 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nge);.    }.  }.
a0d0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
a0e0: 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c  lback(db);.  sql
a0f0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
a100: 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64  loc();..  if( (d
a110: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
a120: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d  InternChanges)!=
a130: 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 && db->init.bu
a140: 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  sy==0 ){.    sql
a150: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
a160: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
a170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
a180: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
a190: 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20  nnection(db);.  
a1a0: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
a1b0: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
a1c0: 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64   /* Any deferred
a1d0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
a1e0: 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20  ations have now 
a1f0: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a  been resolved. *
a200: 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  /.  db->nDeferre
a210: 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d  dCons = 0;.  db-
a220: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
a230: 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  s = 0;.  db->fla
a240: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
a250: 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66  ferFKs;..  /* If
a260: 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f   one has been co
a270: 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65  nfigured, invoke
a280: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f   the rollback-ho
a290: 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ok callback */. 
a2a0: 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61   if( db->xRollba
a2b0: 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69  ckCallback && (i
a2c0: 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61  nTrans || !db->a
a2d0: 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20  utoCommit) ){.  
a2e0: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
a2f0: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c  allback(db->pRol
a300: 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d  lbackArg);.  }.}
a310: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
a320: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63   static string c
a330: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
a340: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
a350: 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f   to the error co
a360: 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  de.** specified 
a370: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  in the argument.
a380: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
a390: 53 51 4c 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f  SQLITE_NEED_ERR_
a3a0: 4e 41 4d 45 29 0a 63 6f 6e 73 74 20 63 68 61 72  NAME).const char
a3b0: 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65   *sqlite3ErrName
a3c0: 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73  (int rc){.  cons
a3d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
a3e0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67  0;.  int i, orig
a3f0: 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69  Rc = rc;.  for(i
a400: 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65  =0; i<2 && zName
a410: 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20  ==0; i++, rc &= 
a420: 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63  0xff){.    switc
a430: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63  h( rc ){.      c
a440: 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20  ase SQLITE_OK:  
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
a460: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f  Name = "SQLITE_O
a470: 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  K";             
a480: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a490: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
a4a0: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
a4b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a4c0: 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20  ERROR";         
a4d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a4e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
a4f0: 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20  ERNAL:          
a500: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a510: 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20  _INTERNAL";     
a520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a530: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
a540: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
a550: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a560: 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20  E_PERM";        
a570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a580: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
a590: 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20  BORT:           
a5a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a5b0: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
a5c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a5d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a5e0: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20  ABORT_ROLLBACK: 
a5f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a600: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
a610: 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  CK";    break;. 
a620: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a630: 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20  _BUSY:          
a640: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a650: 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20  LITE_BUSY";     
a660: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a670: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a680: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a  E_BUSY_RECOVERY:
a690: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a6a0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
a6b0: 45 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ERY";     break;
a6c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a6d0: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
a6e0: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
a6f0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
a700: 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  SHOT";     break
a710: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a720: 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
a730: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a740: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b  "SQLITE_LOCKED";
a750: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a760: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a770: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
a780: 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d  EDCACHE: zName =
a790: 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f   "SQLITE_LOCKED_
a7a0: 53 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65  SHAREDCACHE";bre
a7b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a7c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
a7d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a7e0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  = "SQLITE_NOMEM"
a7f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
a800: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a810: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a  SQLITE_READONLY:
a820: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a830: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
a840: 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62  NLY";          b
a850: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a860: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
a870: 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d  _RECOVERY:  zNam
a880: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
a890: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
a8a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a8b0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
a8c0: 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61  Y_CANTLOCK:  zNa
a8d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
a8e0: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b  DONLY_CANTLOCK";
a8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a900: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
a910: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e  LY_ROLLBACK:  zN
a920: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
a930: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22  ADONLY_ROLLBACK"
a940: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
a950: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
a960: 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a  NLY_DBMOVED:   z
a970: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
a980: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22  EADONLY_DBMOVED"
a990: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
a9a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
a9b0: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
a9c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a9d0: 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20  INTERRUPT";     
a9e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a9f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
aa00: 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR:             
aa10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aa20: 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20  _IOERR";        
aa30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
aa50: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
aa60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aa70: 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20  E_IOERR_READ";  
aa80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aa90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
aaa0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a  OERR_SHORT_READ:
aab0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
aac0: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
aad0: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
aae0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
aaf0: 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20  IOERR_WRITE:    
ab00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ab10: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22  ITE_IOERR_WRITE"
ab20: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
ab30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ab40: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20  _IOERR_FSYNC:   
ab50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ab60: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
ab70: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
ab80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ab90: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
aba0: 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  C:    zName = "S
abb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
abc0: 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b  FSYNC";   break;
abd0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
abe0: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
abf0: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
ac00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
ac10: 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b  NCATE";    break
ac20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ac30: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a  ITE_IOERR_FSTAT:
ac40: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ac50: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
ac60: 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61  TAT";       brea
ac70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ac80: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
ac90: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
aca0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55   "SQLITE_IOERR_U
acb0: 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  NLOCK";      bre
acc0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
acd0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
ace0: 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  CK:       zName 
acf0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ad00: 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72  RDLOCK";      br
ad10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
ad30: 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ETE:       zName
ad40: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ad50: 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62  _DELETE";      b
ad60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ad70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
ad80: 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  MEM:        zNam
ad90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ada0: 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  R_NOMEM";       
adb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
adc0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
add0: 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61  CCESS:       zNa
ade0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
adf0: 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20  RR_ACCESS";     
ae00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ae10: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ae20: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
ae30: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ae60: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
ae70: 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65  SERVEDLOCK"; bre
ae80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
aea0: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
aeb0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aec0: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72  LOCK";        br
aed0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aee0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
aef0: 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  SE:        zName
af00: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
af10: 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62  _CLOSE";       b
af20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
af30: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
af40: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d  R_CLOSE:    zNam
af50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
af60: 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20  R_DIR_CLOSE";   
af70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
af80: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
af90: 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61  HMOPEN:      zNa
afa0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
afb0: 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20  RR_SHMOPEN";    
afc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
afd0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
afe0: 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e  SHMSIZE:      zN
aff0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b000: 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20  ERR_SHMSIZE";   
b010: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b020: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b030: 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a  _SHMLOCK:      z
b040: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b050: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20  OERR_SHMLOCK";  
b060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b070: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b080: 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20  R_SHMMAP:       
b090: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b0a0: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20  IOERR_SHMMAP";  
b0b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b0c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b0d0: 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20  RR_SEEK:        
b0e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b0f0: 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20  _IOERR_SEEK";   
b100: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b110: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b120: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
b130: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
b140: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
b150: 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20  OENT";break;.   
b160: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b170: 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20  OERR_MMAP:      
b180: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b190: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20  TE_IOERR_MMAP"; 
b1a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b1b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1c0: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
b1d0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
b1e0: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
b1f0: 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  PPATH"; break;. 
b200: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b210: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a  _IOERR_CONVPATH:
b220: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b230: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
b240: 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATH";    break;.
b250: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b260: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20  E_CORRUPT:      
b270: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b280: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
b290: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b2a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b2b0: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a  TE_CORRUPT_VTAB:
b2c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b2d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
b2e0: 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  TAB";      break
b2f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b300: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20  ITE_NOTFOUND:   
b310: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b320: 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  "SQLITE_NOTFOUND
b330: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
b340: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b350: 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
b360: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b370: 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20   "SQLITE_FULL"; 
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b390: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b3a0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
b3b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b3c0: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
b3d0: 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  EN";          br
b3e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b3f0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b400: 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65  NOTEMPDIR: zName
b410: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
b420: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62  PEN_NOTEMPDIR";b
b430: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b440: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
b450: 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d  _ISDIR:     zNam
b460: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
b470: 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20  OPEN_ISDIR";    
b480: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b490: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
b4a0: 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61  N_FULLPATH:  zNa
b4b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
b4c0: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b  TOPEN_FULLPATH";
b4d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b4e0: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
b4f0: 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e  EN_CONVPATH:  zN
b500: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
b510: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22  NTOPEN_CONVPATH"
b520: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
b530: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ase SQLITE_PROTO
b540: 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  COL:           z
b550: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
b560: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20  ROTOCOL";       
b570: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b580: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
b590: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
b5a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b5b0: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20  EMPTY";         
b5c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b5d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48   case SQLITE_SCH
b5e0: 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20  EMA:            
b5f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b600: 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20  _SCHEMA";       
b610: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b620: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
b630: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
b640: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b650: 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20  E_TOOBIG";      
b660: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b670: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b680: 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20  ONSTRAINT:      
b690: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b6a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
b6b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b6c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b6d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
b6e0: 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  E:  zName = "SQL
b6f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
b700: 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20  NIQUE"; break;. 
b710: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b720: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
b730: 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  GER: zName = "SQ
b740: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b750: 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a  TRIGGER";break;.
b760: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b770: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
b780: 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20  EIGNKEY:.       
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b7b0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b7c0: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b  INT_FOREIGNKEY";
b7d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b7e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b7f0: 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20  TRAINT_CHECK:   
b800: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b810: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
b820: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
b830: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b840: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
b850: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b880: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
b890: 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72  RIMARYKEY";   br
b8a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b8b0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b8c0: 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65  T_NOTNULL: zName
b8d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b8e0: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62  RAINT_NOTNULL";b
b8f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b900: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b910: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20  NT_COMMITHOOK:. 
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b940: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b950: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
b960: 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a  HOOK";   break;.
b970: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b980: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
b990: 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  B:    zName = "S
b9a0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b9b0: 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b  _VTAB";   break;
b9c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b9d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
b9e0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20  NCTION:.        
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ba10: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
ba20: 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20  NT_FUNCTION";   
ba30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ba40: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ba50: 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a  RAINT_ROWID:   z
ba60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
ba70: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22  ONSTRAINT_ROWID"
ba80: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
ba90: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
baa0: 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20  ATCH:           
bab0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bac0: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20  MISMATCH";      
bad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bae0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
baf0: 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  USE:            
bb00: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bb10: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20  _MISUSE";       
bb20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bb30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
bb40: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
bb50: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bb60: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
bb70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bb80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
bb90: 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  UTH:            
bba0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bbb0: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
bbc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bbd0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bbe0: 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20  FORMAT:         
bbf0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bc00: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
bc10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bc20: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bc30: 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20  _RANGE:         
bc40: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bc50: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
bc60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bc70: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bc80: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
bc90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bca0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
bcb0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bcc0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bcd0: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20  TE_ROW:         
bce0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bcf0: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
bd00: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bd10: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bd20: 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20  ITE_NOTICE:     
bd30: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bd40: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b  "SQLITE_NOTICE";
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bd60: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bd70: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
bd80: 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d  VER_WAL: zName =
bd90: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
bda0: 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65  RECOVER_WAL";bre
bdb0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bdc0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
bdd0: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20  OVER_ROLLBACK:. 
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
be00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
be10: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
be20: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
be30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
be40: 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20  E_WARNING:      
be50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
be60: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20  QLITE_WARNING"; 
be70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
be80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be90: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
bea0: 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  NDEX:  zName = "
beb0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
bec0: 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  UTOINDEX"; break
bed0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bee0: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
bef0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bf00: 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20  "SQLITE_DONE";  
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bf20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
bf30: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
bf40: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
bf50: 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
bf60: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
bf70: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
bf80: 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57  , "SQLITE_UNKNOW
bf90: 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b  N(%d)", origRc);
bfa0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75  .    zName = zBu
bfb0: 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  f;.  }.  return 
bfc0: 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
bfd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
bfe0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
bff0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
c000: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
c010: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
c020: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
c030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
c040: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
c050: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
c060: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
c070: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
c080: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
c090: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
c0a0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c0b0: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
c0c0: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
c0d0: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
c0e0: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
c0f0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
c100: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
c110: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
c120: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
c130: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
c140: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c150: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
c160: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
c170: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
c180: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c190: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
c1a0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
c1b0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c1c0: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
c1d0: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
c1e0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
c1f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
c200: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
c210: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
c220: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
c230: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
c240: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
c250: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
c260: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
c270: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
c280: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
c290: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
c2a0: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
c2b0: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
c2c0: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
c2d0: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
c2e0: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
c2f0: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
c300: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
c310: 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f  UND    */ "unkno
c320: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20  wn operation",. 
c330: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
c340: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
c350: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
c360: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
c370: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
c380: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
c390: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
c3a0: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
c3b0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
c3c0: 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  / "locking proto
c3d0: 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  col",.    /* SQL
c3e0: 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20  ITE_EMPTY       
c3f0: 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69  */ "table contai
c400: 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20  ns no data",.   
c410: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
c420: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
c430: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
c440: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
c450: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
c460: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
c470: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
c480: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
c490: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
c4a0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
c4b0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c4c0: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
c4d0: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
c4e0: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
c4f0: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
c500: 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e   "library routin
c510: 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20  e called out of 
c520: 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f  sequence",.    /
c530: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
c540: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
c550: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
c560: 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a  isabled",.    /*
c570: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
c580: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
c590: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
c5a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
c5b0: 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78  MAT      */ "aux
c5c0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
c5d0: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20  format error",. 
c5e0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
c5f0: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e  GE       */ "bin
c600: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
c610: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
c620: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
c630: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
c640: 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
c650: 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
c660: 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  abase",.  };.  c
c670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
c680: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
c690: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
c6a0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
c6b0: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
c6c0: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
c6d0: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
c6e0: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
c6f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c700: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
c710: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
c720: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
c730: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
c740: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
c750: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
c760: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
c770: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
c780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c790: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c7a0: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
c7b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
c7c0: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
c7d0: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
c7e0: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
c7f0: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
c800: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
c810: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
c820: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
c830: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
c840: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
c850: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
c860: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
c870: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
c880: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
c890: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
c8a0: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
c8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
c8c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c8d0: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c8f0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
c900: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
c910: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
c920: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
c930: 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 73 74  HAVE_USLEEP.  st
c940: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65  atic const u8 de
c950: 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  lays[] =.     { 
c960: 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c  1, 2, 5, 10, 15,
c970: 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35   20, 25, 25,  25
c980: 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20  ,  50,  50, 100 
c990: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
c9a0: 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a  t u8 totals[] =.
c9b0: 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20       { 0, 1, 3, 
c9c0: 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20   8, 18, 33, 53, 
c9d0: 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37  78, 103, 128, 17
c9e0: 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69  8, 228 };.# defi
c9f0: 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53  ne NDELAY ArrayS
ca00: 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71  ize(delays).  sq
ca10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
ca20: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
ca30: 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e  t timeout = db->
ca40: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
ca50: 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b  nt delay, prior;
ca60: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ..  assert( coun
ca70: 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f  t>=0 );.  if( co
ca80: 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a  unt < NDELAY ){.
ca90: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
caa0: 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70  ys[count];.    p
cab0: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f  rior = totals[co
cac0: 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unt];.  }else{. 
cad0: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
cae0: 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20  s[NDELAY-1];.   
caf0: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
cb00: 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61  NDELAY-1] + dela
cb10: 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59  y*(count-(NDELAY
cb20: 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  -1));.  }.  if( 
cb30: 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20  prior + delay > 
cb40: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64  timeout ){.    d
cb50: 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d  elay = timeout -
cb60: 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20   prior;.    if( 
cb70: 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72  delay<=0 ) retur
cb80: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
cb90: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
cba0: 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b  fs, delay*1000);
cbb0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c  .  return 1;.#el
cbc0: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  se.  sqlite3 *db
cbd0: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
cbe0: 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  r;.  int timeout
cbf0: 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70   = ((sqlite3 *)p
cc00: 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74  tr)->busyTimeout
cc10: 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31  ;.  if( (count+1
cc20: 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74  )*1000 > timeout
cc30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cc40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
cc50: 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c  sSleep(db->pVfs,
cc60: 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74   1000000);.  ret
cc70: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
cc80: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
cc90: 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e  e given busy han
cca0: 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dler..**.** This
ccb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ccc0: 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61  ed when an opera
ccd0: 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68  tion failed with
cce0: 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74   a lock..** If t
ccf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
cd00: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
cd10: 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65  e lock is retrie
cd20: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74  d.  If it.** ret
cd30: 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72  urns 0, the oper
cd40: 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74  ation aborts wit
cd50: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
cd60: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
cd70: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
cd80: 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64  Handler(BusyHand
cd90: 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ler *p){.  int r
cda0: 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  c;.  if( NEVER(p
cdb0: 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63  ==0) || p->xFunc
cdc0: 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c  ==0 || p->nBusy<
cdd0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
cde0: 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d  rc = p->xFunc(p-
cdf0: 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29  >pArg, p->nBusy)
ce00: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
ce10: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20  .    p->nBusy = 
ce20: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
ce30: 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d   p->nBusy++;.  }
ce40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d  .  return rc; .}
ce50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ce60: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75  tine sets the bu
ce70: 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  sy callback for 
ce80: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
ce90: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
cea0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
ceb0: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
cec0: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ven argument..*/
ced0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
cee0: 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  y_handler(.  sql
cef0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
cf00: 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69  (*xBusy)(void*,i
cf10: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
cf20: 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  g.){.#ifdef SQLI
cf30: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
cf40: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
cf50: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
cf60: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
cf70: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
cf80: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
cf90: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
cfa0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
cfb0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
cfc0: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
cfd0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
cfe0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
cff0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
d000: 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73  y = 0;.  db->bus
d010: 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20  yTimeout = 0;.  
d020: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d030: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
d040: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d050: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
d060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
d070: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
d080: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d090: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
d0a0: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
d0b0: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
d0c0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
d0d0: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
d0e0: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
d0f0: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
d100: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
d110: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
d120: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
d130: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
d140: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
d150: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
d160: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
d170: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
d180: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
d190: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
d1a0: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
d1b0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
d1c0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
d1d0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
d1e0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
d1f0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d200: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
d210: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
d220: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d230: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
d240: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
d250: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
d260: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
d270: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
d280: 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70   = (unsigned)nOp
d290: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
d2a0: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
d2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
d2c0: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
d2d0: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
d2e0: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
d2f0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
d300: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
d310: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d320: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
d330: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
d340: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
d350: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
d360: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
d370: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
d380: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
d390: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
d3a0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
d3b0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
d3c0: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
d3d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
d3e0: 6d 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ms){.#ifdef SQLI
d3f0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
d400: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
d410: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
d420: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
d430: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
d440: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73  .#endif.  if( ms
d450: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
d460: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
d470: 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  b, sqliteDefault
d480: 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76  BusyCallback, (v
d490: 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62  oid*)db);.    db
d4a0: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
d4b0: 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ms;.  }else{.   
d4c0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
d4d0: 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b  ndler(db, 0, 0);
d4e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
d4f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d500: 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64  * Cause any pend
d510: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  ing operation to
d520: 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72   stop at its ear
d530: 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74  liest opportunit
d540: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
d550: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c  e3_interrupt(sql
d560: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
d570: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d580: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
d590: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
d5a0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
d5b0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
d5c0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
d5d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
d5e0: 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  f.  db->u1.isInt
d5f0: 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a  errupted = 1;.}.
d600: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
d610: 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ction is exactly
d620: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
d630: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
d640: 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a  tion(), except.*
d650: 2a 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73  * that it is des
d660: 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  igned to be call
d670: 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63  ed by internal c
d680: 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65  ode. The differe
d690: 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69  nce is.** that i
d6a0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
d6b0: 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72  ls in sqlite3_cr
d6c0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
d6d0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a   an error code.*
d6e0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
d6f0: 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c  d the mallocFail
d700: 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e  ed flag cleared.
d710: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
d720: 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71  CreateFunc(.  sq
d730: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
d740: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69  st char *zFuncti
d750: 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  onName,.  int nA
d760: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
d770: 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61   void *pUserData
d780: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e  ,.  void (*xSFun
d790: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
d7a0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
d7b0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
d7c0: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
d7d0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
d7e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
d7f0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
d800: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
d810: 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73  ext*),.  FuncDes
d820: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
d830: 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65  ctor.){.  FuncDe
d840: 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  f *p;.  int nNam
d850: 65 3b 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c  e;.  int extraFl
d860: 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ags;..  assert( 
d870: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d880: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
d890: 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e  .  if( zFunction
d8a0: 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  Name==0 ||.     
d8b0: 20 28 78 53 46 75 6e 63 20 26 26 20 28 78 46 69   (xSFunc && (xFi
d8c0: 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c  nal || xStep)) |
d8d0: 7c 20 0a 20 20 20 20 20 20 28 21 78 53 46 75 6e  | .      (!xSFun
d8e0: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20  c && (xFinal && 
d8f0: 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20  !xStep)) ||.    
d900: 20 20 28 21 78 53 46 75 6e 63 20 26 26 20 28 21    (!xSFunc && (!
d910: 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29  xFinal && xStep)
d920: 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67  ) ||.      (nArg
d930: 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49  <-1 || nArg>SQLI
d940: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
d950: 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32  ARG) ||.      (2
d960: 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  55<(nName = sqli
d970: 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75  te3Strlen30( zFu
d980: 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b  nctionName))) ){
d990: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d9a0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
d9b0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53    }..  assert( S
d9c0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
d9d0: 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45  ANT==SQLITE_DETE
d9e0: 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65  RMINISTIC );.  e
d9f0: 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20  xtraFlags = enc 
da00: 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  &  SQLITE_DETERM
da10: 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26  INISTIC;.  enc &
da20: 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45  = (SQLITE_FUNC_E
da30: 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e  NCMASK|SQLITE_AN
da40: 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53  Y);.  .#ifndef S
da50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
da60: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
da70: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
da80: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
da90: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
daa0: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
dab0: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
dac0: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
dad0: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
dae0: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
daf0: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
db00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
db10: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
db20: 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ally..  **.  ** 
db30: 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73  If SQLITE_ANY is
db40: 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20   specified, add 
db50: 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
db60: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20  f the function. 
db70: 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20   ** to the hash 
db80: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
db90: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ( enc==SQLITE_UT
dba0: 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d  F16 ){.    enc =
dbb0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
dbc0: 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  IVE;.  }else if(
dbd0: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59   enc==SQLITE_ANY
dbe0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
dbf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dc00: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
dc10: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
dc20: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c  rg, SQLITE_UTF8|
dc30: 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20  extraFlags,.    
dc40: 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20       pUserData, 
dc50: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78  xSFunc, xStep, x
dc60: 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74  Final, pDestruct
dc70: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  or);.    if( rc=
dc80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dc90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dca0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
dcb0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
dcc0: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  rg, SQLITE_UTF16
dcd0: 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  LE|extraFlags,. 
dce0: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
dcf0: 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65  ta, xSFunc, xSte
dd00: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
dd10: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
dd20: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
dd30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
dd40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
dd50: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
dd60: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
dd70: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
dd80: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
dd90: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
dda0: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
ddb0: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
ddc0: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
ddd0: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
dde0: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
ddf0: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
de00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
de10: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
de20: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
de30: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
de40: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
de50: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
de60: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
de70: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
de80: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
de90: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
dea0: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
deb0: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
dec0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
ded0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
dee0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
def0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
df00: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
df10: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
df20: 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e  ASK)==enc && p->
df30: 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg==nArg ){.  
df40: 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
df50: 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
df60: 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
df70: 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
df80: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
df90: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
dfa0: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
dfb0: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
dfc0: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
dfd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
dfe0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
dff0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e000: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
e010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
e020: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
e030: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
e040: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
e050: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
e060: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
e070: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
e080: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
e090: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
e0a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
e0b0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
e0c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e0d0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
e0e0: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
e0f0: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
e100: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
e110: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
e120: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
e130: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
e140: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
e150: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
e160: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
e170: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
e180: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
e190: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
e1a0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
e1b0: 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  u.pDestructor = 
e1c0: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
e1d0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70  ->funcFlags = (p
e1e0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
e1f0: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
e200: 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b  K) | extraFlags;
e210: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
e220: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
e230: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
e240: 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20   );.  p->xSFunc 
e250: 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e  = xSFunc ? xSFun
e260: 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  c : xStep;.  p->
e270: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
e280: 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  al;.  p->pUserDa
e290: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
e2a0: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36    p->nArg = (u16
e2b0: 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  )nArg;.  return 
e2c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e2d0: 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75  .** Create new u
e2e0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ser functions..*
e2f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
e300: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
e310: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
e320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
e330: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
e340: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
e350: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
e360: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
e370: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e380: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e390: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e3a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e3b0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e3c0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e3d0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e3e0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
e3f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
e400: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
e410: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
e420: 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c   enc, p, xSFunc,
e430: 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20   xStep,.        
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e              xFin
e460: 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73  al, 0);.}..int s
e470: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e480: 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  nction_v2(.  sql
e490: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e4a0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
e4b0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e4c0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
e4d0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63  .  void (*xSFunc
e4e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e4f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e500: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e510: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
e520: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e530: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e540: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
e550: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
e560: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
e570: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29  Destroy)(void *)
e580: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
e590: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46  QLITE_ERROR;.  F
e5a0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
e5b0: 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  Arg = 0;..#ifdef
e5c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e5d0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e5e0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
e5f0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
e600: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e610: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
e620: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
e630: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e640: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44  mutex);.  if( xD
e650: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41  estroy ){.    pA
e660: 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75  rg = (FuncDestru
e670: 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62  ctor *)sqlite3Db
e680: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
e690: 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75  izeof(FuncDestru
e6a0: 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ctor));.    if( 
e6b0: 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78  !pArg ){.      x
e6c0: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
e6d0: 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20    goto out;.    
e6e0: 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73  }.    pArg->xDes
e6f0: 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b  troy = xDestroy;
e700: 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72  .    pArg->pUser
e710: 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Data = p;.  }.  
e720: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
e730: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
e740: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
e750: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78  xSFunc, xStep, x
e760: 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20  Final, pArg);.  
e770: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
e780: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
e790: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e7a0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
e7b0: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
e7c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e7d0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75   pArg);.  }.. ou
e7e0: 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
e7f0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
e800: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
e810: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
e820: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
e830: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
e840: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
e850: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
e860: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
e870: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
e880: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
e890: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
e8a0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
e8b0: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
e8c0: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
e8d0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e8e0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e8f0: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
e900: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
e910: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e920: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
e930: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
e940: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e950: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
e960: 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a   char *zFunc8;..
e970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e980: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e990: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
e9a0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
e9b0: 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  | zFunctionName=
e9c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
e9d0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
e9e0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
e9f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ea00: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
ea10: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
ea20: 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38  iled );.  zFunc8
ea30: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
ea40: 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  o8(db, zFunction
ea50: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
ea60: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
ea70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
ea80: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
ea90: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
eaa0: 65 70 2c 20 70 2c 20 78 53 46 75 6e 63 2c 78 53  ep, p, xSFunc,xS
eab0: 74 65 70 2c 78 46 69 6e 61 6c 2c 30 29 3b 0a 20  tep,xFinal,0);. 
eac0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ead0: 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63  b, zFunc8);.  rc
eae0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
eaf0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
eb00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
eb10: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
eb20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
eb30: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  if.../*.** Decla
eb40: 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69  re that a functi
eb50: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
eb60: 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74  loaded by a virt
eb70: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
eb80: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
eb90: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
eba0: 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f  as a regular glo
ebb0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  bal function, th
ebc0: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
ebd0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
ebe0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
ebf0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
ec00: 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61  then create.** a
ec10: 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c   new one that al
ec20: 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75  ways throws a ru
ec30: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a  n-time error.  .
ec40: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75  **.** When virtu
ec50: 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64  al tables intend
ec60: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f   to provide an o
ec70: 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69  verloaded functi
ec80: 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75  on, they.** shou
ec90: 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ld call this rou
eca0: 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  tine to make sur
ecb0: 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  e the global fun
ecc0: 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a  ction exists..**
ecd0: 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69   A global functi
ece0: 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e  on must exist in
ecf0: 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20   order for name 
ed00: 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f  resolution to wo
ed10: 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a  rk.** properly..
ed20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
ed30: 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
ed40: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
ed50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ed60: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
ed70: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
ed80: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
ed90: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
eda0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
edb0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
edc0: 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
edd0: 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32  me==0 || nArg<-2
ede0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
edf0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
ee00: 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
ee10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ee20: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ee30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
ee40: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
ee50: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
ee60: 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b  E_UTF8, 0)==0 ){
ee70: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ee80: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ee90: 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
eea0: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49       0, sqlite3I
eed0: 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20  nvalidFunction, 
eee0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
eef0: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
ef00: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
ef10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ef20: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
ef30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
ef40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef50: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52  IT_TRACE./*.** R
ef60: 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
ef70: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
ef80: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
ef90: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
efa0: 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72  ed trace.** is r
efb0: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
efc0: 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75   A NULL trace fu
efd0: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
efe0: 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20  t no tracing is 
eff0: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
f000: 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69  -NULL.** trace i
f010: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
f020: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
f030: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
f040: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a   start of each.*
f050: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  * SQL statement.
f060: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
f070: 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20  3_trace(sqlite3 
f080: 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61  *db, void (*xTra
f090: 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  ce)(void*,const 
f0a0: 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  char*), void *pA
f0b0: 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  rg){.  void *pOl
f0c0: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
f0d0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f0e0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f0f0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f100: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
f110: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f120: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
f130: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
f140: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f150: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f160: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61   pOld = db->pTra
f170: 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72  ceArg;.  db->xTr
f180: 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20  ace = xTrace;.  
f190: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20  db->pTraceArg = 
f1a0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
f1b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f1c0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f1d0: 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52   pOld;.}./*.** R
f1e0: 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c  egister a profil
f1f0: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
f200: 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
f210: 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
f220: 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65  ered .** profile
f230: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74   function is ret
f240: 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
f250: 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75   NULL profile fu
f260: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
f270: 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69  t no profiling i
f280: 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
f290: 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69  on-NULL.** profi
f2a0: 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  le is a pointer 
f2b0: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
f2c0: 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
f2d0: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
f2e0: 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73  of.** each SQL s
f2f0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
f300: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73   run..*/.void *s
f310: 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a  qlite3_profile(.
f320: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f330: 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65   void (*xProfile
f340: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
f350: 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36  ar*,sqlite_uint6
f360: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
f370: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
f380: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f390: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f3a0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f3b0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f3c0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
f3d0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f3e0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
f3f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
f400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f410: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f420: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66  pOld = db->pProf
f430: 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ileArg;.  db->xP
f440: 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c  rofile = xProfil
f450: 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c  e;.  db->pProfil
f460: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
f470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f480: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f490: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
f4a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f4b0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a  _OMIT_TRACE */..
f4c0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
f4d0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
f4e0: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
f4f0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
f500: 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
f510: 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
f520: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
f530: 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
f540: 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
f550: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
f560: 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
f570: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
f580: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
f590: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
f5a0: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
f5b0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
f5c0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
f5d0: 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
f5e0: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
f5f0: 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
f600: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
f610: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
f620: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
f630: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
f640: 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
f650: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f660: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f670: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f680: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f690: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
f6a0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
f6b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
f6c0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f6d0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f6e0: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
f6f0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20  ->pCommitArg;.  
f700: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
f710: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
f720: 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  .  db->pCommitAr
f730: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
f740: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f750: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f760: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a  turn pOld;.}../*
f770: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
f780: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
f790: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
f7a0: 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
f7b0: 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
f7c0: 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
f7d0: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
f7e0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
f7f0: 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65   *sqlite3_update
f800: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
f810: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f820: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
f830: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
f840: 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
f850: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
f860: 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  id*,int,char con
f870: 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20  st *,char const 
f880: 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c  *,sqlite_int64),
f890: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8b0: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
f8c0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
f8d0: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69   void *pRet;..#i
f8e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f8f0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
f900: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f910: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
f920: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
f930: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f940: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f950: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f960: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f970: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
f980: 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
f990: 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
f9a0: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
f9b0: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
f9c0: 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
f9d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f9e0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f9f0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
fa00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
fa10: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
fa20: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
fa30: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
fa40: 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
fa50: 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
fa60: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
fa70: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
fa80: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
fa90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fab0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
fac0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
fad0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
fae0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
faf0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
fb00: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
fb10: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
fb20: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
fb30: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
fb40: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
fb50: 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  et;..#ifdef SQLI
fb60: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
fb70: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
fb80: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
fb90: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
fba0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
fbb0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
fbc0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
fbd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fbe0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
fbf0: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f    pRet = db->pRo
fc00: 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d  llbackArg;.  db-
fc10: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
fc20: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
fc30: 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41    db->pRollbackA
fc40: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
fc50: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fc60: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
fc70: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
fc80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fc90: 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65  IT_WAL./*.** The
fca0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
fcb0: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  k() callback reg
fcc0: 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74  istered by sqlit
fcd0: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
fce0: 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f  point()..** Invo
fcf0: 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  ke sqlite3_wal_c
fd00: 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
fd10: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
fd20: 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
fd30: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
fd40: 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61  than sqlite3.pWa
fd50: 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20  lArg cast to an 
fd60: 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c  integer (the val
fd70: 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ue configured by
fd80: 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  .** wal_autochec
fd90: 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69  kpoint())..*/ .i
fda0: 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  nt sqlite3WalDef
fdb0: 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64  aultHook(.  void
fdc0: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20   *pClientData,  
fdd0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a     /* Argument *
fde0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
fdf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fe00: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
fe10: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
fe20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
fe30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65   */.  int nFrame
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe50: 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29  Size of WAL */.)
fe60: 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d  {.  if( nFrame>=
fe70: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
fe80: 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29  T(pClientData) )
fe90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
fea0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
feb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  ;.    sqlite3_wa
fec0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  l_checkpoint(db,
fed0: 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   zDb);.    sqlit
fee0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
fef0: 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c();.  }.  retur
ff00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
ff10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ff20: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
ff30: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20  ** Configure an 
ff40: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
ff50: 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  () callback to a
ff60: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
ff70: 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74  ckpoint.** a dat
ff80: 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d  abase after comm
ff90: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
ffa0: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
ffb0: 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d  e nFrame or.** m
ffc0: 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68  ore frames in th
ffd0: 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73  e log file. Pass
ffe0: 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65  ing zero or a ne
fff0: 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20  gative value as 
10000 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61  the.** nFrame pa
10010 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73  rameter disables
10020 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
10030 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e  points entirely.
10040 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  .**.** The callb
10050 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
10060 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
10070 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69  replaces any exi
10080 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a  sting callback.*
10090 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69  * registered usi
100a0 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
100b0 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c  ook(). Likewise,
100c0 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63   registering a c
100d0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  allback.** using
100e0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
100f0 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65  k() disables the
10100 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
10110 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a  point mechanism.
10120 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
10130 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
10140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
10150 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
10160 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
10170 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64  nt nFrame){.#ifd
10180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
10190 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  AL.  UNUSED_PARA
101a0 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
101b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
101c0 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66  rame);.#else.#if
101d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
101e0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
101f0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
10200 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
10210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
10220 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
10230 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29    if( nFrame>0 )
10240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
10250 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74  l_hook(db, sqlit
10260 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
10270 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
10280 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20  PTR(nFrame));.  
10290 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
102a0 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
102b0 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
102c0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
102d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
102e0 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
102f0 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
10300 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
10310 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74  nsaction is writ
10320 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ten.** into the 
10330 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20  write-ahead-log 
10340 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
10350 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
10360 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61  void *sqlite3_wa
10370 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  l_hook(.  sqlite
10380 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
103a0 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
103b0 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a  this db handle *
103c0 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61  /.  int(*xCallba
103d0 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69  ck)(void *, sqli
103e0 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
103f0 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  *, int),.  void 
10400 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
10410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
10420 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
10430 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  sed to xCallback
10440 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  () */.){.#ifndef
10450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
10460 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23  .  void *pRet;.#
10470 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10480 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10490 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
104a0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
104b0 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
104c0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
104d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
104e0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
104f0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10500 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
10510 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a   = db->pWalArg;.
10520 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61    db->xWalCallba
10530 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
10540 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20    db->pWalArg = 
10550 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
10560 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10570 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10580 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72   pRet;.#else.  r
10590 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
105a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  }../*.** Checkpo
105b0 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
105c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
105d0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
105e0 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
105f0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
10600 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
10610 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
10620 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10640 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65   Name of attache
10650 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e  d database (or N
10660 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d  ULL) */.  int eM
10670 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
10680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
10690 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a  ITE_CHECKPOINT_*
106a0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
106b0 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20  *pnLog,         
106c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
106d0 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20  UT: Size of WAL 
106e0 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f  log in frames */
106f0 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20  .  int *pnCkpt  
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10710 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c     /* OUT: Total
10720 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
10730 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a  s checkpointed *
10740 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  /.){.#ifdef SQLI
10750 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65  TE_OMIT_WAL.  re
10760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10770 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20  #else.  int rc; 
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10790 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
107a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
107b0 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  iDb = SQLITE_MAX
107c0 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73  _ATTACHED;  /* s
107d0 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64  qlite3.aDb[] ind
107e0 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63  ex of db to chec
107f0 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  kpoint */..#ifde
10800 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10810 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10820 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10830 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
10840 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
10850 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20  _BKPT;.#endif.. 
10860 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
10870 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
10880 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73  les to -1 in cas
10890 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
108a0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f  s. */.  if( pnLo
108b0 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b  g ) *pnLog = -1;
108c0 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20  .  if( pnCkpt ) 
108d0 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20  *pnCkpt = -1;.. 
108e0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
108f0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
10900 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  VE==0 );.  asser
10910 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
10920 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a  OINT_FULL==1 );.
10930 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
10940 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
10950 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65  ART==2 );.  asse
10960 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
10970 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d  POINT_TRUNCATE==
10980 33 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  3 );.  if( eMode
10990 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  <SQLITE_CHECKPOI
109a0 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d  NT_PASSIVE || eM
109b0 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode>SQLITE_CHECK
109c0 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29  POINT_TRUNCATE )
109d0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
109e0 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32  E-OF: R-03996-12
109f0 30 38 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65  088 The M parame
10a00 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 76 61  ter must be a va
10a10 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20  lid checkpoint. 
10a20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20     ** mode: */. 
10a30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10a40 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
10a50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10a60 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10a70 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
10a80 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
10a90 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
10aa0 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
10ab0 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
10ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10ad0 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
10ae0 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
10af0 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  b, SQLITE_ERROR,
10b00 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
10b10 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20  se: %s", zDb);. 
10b20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
10b30 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
10b40 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
10b50 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
10b60 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65  t(db, iDb, eMode
10b70 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
10b80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
10b90 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a  or(db, rc);.  }.
10ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
10bb0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
10bc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10bd0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10be0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
10bf0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.}.../*.** C
10c00 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
10c10 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69  se zDb. If zDb i
10c20 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68  s NULL, or if th
10c30 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69  e buffer zDb poi
10c40 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69  nts.** to contai
10c50 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ns a zero-length
10c60 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74   string, all att
10c70 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
10c80 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69  are .** checkpoi
10c90 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
10ca0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10cb0 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
10cc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
10cd0 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ){.  /* EVIDENCE
10ce0 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35  -OF: R-41613-205
10cf0 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  53 The sqlite3_w
10d00 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c  al_checkpoint(D,
10d10 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  X) is equivalent
10d20 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   to.  ** sqlite3
10d30 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
10d40 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48  v2(D,X,SQLITE_CH
10d50 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
10d60 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75  ,0,0). */.  retu
10d70 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
10d80 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
10d90 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  zDb,SQLITE_CHECK
10da0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
10db0 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
10dc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
10dd0 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b  *.** Run a check
10de0 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73  point on databas
10df0 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61  e iDb. This is a
10e00 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61   no-op if databa
10e10 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74  se iDb is.** not
10e20 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
10e30 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  in WAL mode..**.
10e40 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
10e50 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74  ion is open on t
10e60 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
10e70 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20  g checkpointed, 
10e80 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
10e90 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
10ea0 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68  _LOCKED and a ch
10eb0 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  eckpoint is not 
10ec0 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a  attempted. If .*
10ed0 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
10ee0 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  s while running 
10ef0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  the checkpoint, 
10f00 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
10f10 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
10f20 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54  rned (i.e. SQLIT
10f30 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77  E_IOERR). Otherw
10f40 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
10f50 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
10f60 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
10f70 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20  le db should be 
10f80 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c  held by the call
10f90 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a  er. The mutex.**
10fa0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10fb0 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d   the specific b-
10fc0 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
10fd0 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e  pointed is taken
10fe0 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63   by.** this func
10ff0 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63  tion while the c
11000 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e  heckpoint is run
11010 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ning..**.** If i
11020 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c  Db is passed SQL
11030 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
11040 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63  , then all attac
11050 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
11060 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65  e.** checkpointe
11070 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  d. If an error i
11080 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
11090 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
110a0 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f  ediately -.** no
110b0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
110c0 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   to checkpoint a
110d0 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74  ny remaining dat
110e0 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61  abases..**.** Pa
110f0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73  rameter eMode is
11100 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
11110 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
11120 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41  E, FULL or RESTA
11130 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  RT..*/.int sqlit
11140 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  e3Checkpoint(sql
11150 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
11160 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e  b, int eMode, in
11170 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70  t *pnLog, int *p
11180 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63  nCkpt){.  int rc
11190 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
111a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
111b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
111c0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
111e0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
111f0 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65   through attache
11200 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62  d dbs */.  int b
11210 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Busy = 0;       
11220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11230 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53  ue if SQLITE_BUS
11240 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75  Y has been encou
11250 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73  ntered */..  ass
11260 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11270 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
11280 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
11290 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67  !pnLog || *pnLog
112a0 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ==-1 );.  assert
112b0 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e  ( !pnCkpt || *pn
112c0 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66  Ckpt==-1 );..  f
112d0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
112e0 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b && rc==SQLITE_
112f0 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  OK; i++){.    if
11300 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d  ( i==iDb || iDb=
11310 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
11320 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63  CHED ){.      rc
11330 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
11340 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44  heckpoint(db->aD
11350 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c  b[i].pBt, eMode,
11360 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b   pnLog, pnCkpt);
11370 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30  .      pnLog = 0
11380 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d  ;.      pnCkpt =
11390 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
113a0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
113b0 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d  .        bBusy =
113c0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
113d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
113e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
113f0 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
11400 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29  ITE_OK && bBusy)
11410 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
11420 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
11430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11440 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
11450 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11460 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65   true if main-me
11470 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mory should be u
11480 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  sed instead of.*
11490 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
114a0 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  le for transient
114b0 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64   pager files and
114c0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
114d0 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  als..** The valu
114e0 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e  e returned depen
114f0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
11500 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  of db->temp_stor
11510 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61  e (runtime.** pa
11520 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65  rameter) and the
11530 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
11540 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45  lue of SQLITE_TE
11550 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a  MP_STORE. The.**
11560 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
11570 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
11580 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
11590 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61  een these two va
115a0 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73  lues.** and this
115b0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
115c0 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  n value..**.**  
115d0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
115e0 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
115f0 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
11600 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
11610 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
11620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
11630 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
11640 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
11650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11660 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
11690 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
116a0 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
116d0 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
116e0 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
116f0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
11700 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
11710 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
11720 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
11730 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
11740 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
11760 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
11770 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
117b0 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
117e0 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
117f0 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20  turn 1).**   2  
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
11820 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
11830 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
11840 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
11850 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
11860 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
11870 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f     (return 1).*/
11880 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70  .int sqlite3Temp
11890 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73  InMemory(const s
118a0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
118b0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
118c0 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28  RE==1.  return (
118d0 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
118e0 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =2 );.#endif.#if
118f0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11900 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28  RE==2.  return (
11910 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
11920 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =1 );.#endif.#if
11930 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11940 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50  RE==3.  UNUSED_P
11950 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
11960 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
11970 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
11980 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49  _STORE<1 || SQLI
11990 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a  TE_TEMP_STORE>3.
119a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
119b0 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ER(db);.  return
119c0 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
119d0 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38  .** Return UTF-8
119e0 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
119f0 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
11a00 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
11a10 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
11a20 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
11a30 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
11a40 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
11a50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
11a60 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
11a70 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
11a80 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
11a90 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  EM);.  }.  if( !
11aa0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
11ab0 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
11ac0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
11ad0 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
11ae0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a  E_MISUSE_BKPT);.
11af0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
11b00 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
11b10 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
11b20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11b30 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
11b40 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
11b50 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EM);.  }else{.  
11b60 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
11b70 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a  pErr==0 );.    z
11b80 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
11b90 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d  3_value_text(db-
11ba0 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65  >pErr);.    asse
11bb0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
11bc0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
11bd0 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   z==0 ){.      z
11be0 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
11bf0 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20  (db->errCode);. 
11c00 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
11c10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
11c20 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11c30 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
11c40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
11c50 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  F16./*.** Return
11c60 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
11c70 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
11c80 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
11c90 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
11ca0 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
11cb0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
11cc0 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65  _errmsg16(sqlite
11cd0 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
11ce0 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66   const u16 outOf
11cf0 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f  Mem[] = {.    'o
11d00 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
11d10 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c  , 'o', 'f', ' ',
11d20 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20   'm', 'e', 'm', 
11d30 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30  'o', 'r', 'y', 0
11d40 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
11d50 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b  onst u16 misuse[
11d60 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27  ] = {.    'l', '
11d70 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61  i', 'b', 'r', 'a
11d80 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27  ', 'r', 'y', ' '
11d90 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c  , .    'r', 'o',
11da0 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20   'u', 't', 'i', 
11db0 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a  'n', 'e', ' ', .
11dc0 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c      'c', 'a', 'l
11dd0 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27  ', 'l', 'e', 'd'
11de0 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
11df0 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
11e00 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27  .    'o', 'f', '
11e10 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65   ', .    's', 'e
11e20 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27  ', 'q', 'u', 'e'
11e30 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c  , 'n', 'c', 'e',
11e40 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
11e50 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
11e60 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
11e70 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
11e80 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
11e90 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
11ea0 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
11eb0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
11ec0 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
11ed0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11ee0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
11ef0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
11f00 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11f10 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
11f20 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
11f30 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
11f40 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
11f50 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
11f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
11f70 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
11f80 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65  (db, db->errCode
11f90 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
11fa0 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20  db->errCode));. 
11fb0 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
11fc0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
11fd0 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
11fe0 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
11ff0 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
12000 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
12010 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
12020 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
12030 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
12040 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
12050 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
12060 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
12070 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
12080 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
12090 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
120a0 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
120b0 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
120c0 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
120d0 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
120e0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
120f0 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
12100 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
12110 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65     sqlite3OomCle
12120 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  ar(db);.  }.  sq
12130 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12140 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
12150 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
12160 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12170 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
12180 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
12190 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
121a0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
121b0 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
121c0 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
121d0 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
121e0 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
121f0 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
12200 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
12210 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
12220 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
12230 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
12240 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
12250 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12260 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
12270 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12280 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
12290 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
122a0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
122b0 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
122c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
122d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
122e0 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72  errCode & db->er
122f0 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rMask;.}.int sql
12300 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
12310 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
12320 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
12330 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
12340 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
12350 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12360 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12370 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
12380 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
12390 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
123a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
123b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
123c0 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  >errCode;.}../*.
123d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69  ** Return a stri
123e0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
123f0 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
12400 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
12410 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
12420 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73  .  For now, this
12430 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68   simply calls th
12440 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74  e internal sqlit
12450 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75  e3ErrStr().** fu
12460 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74  nction..*/.const
12470 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65   char *sqlite3_e
12480 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20  rrstr(int rc){. 
12490 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
124a0 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a  rrStr(rc);.}../*
124b0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
124c0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
124d0 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65  ion for database
124e0 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65   "db".  The name
124f0 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64   is zName.** and
12500 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   the encoding is
12510 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   enc..*/.static 
12520 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  int createCollat
12530 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
12540 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
12550 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65   *zName, .  u8 e
12560 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  nc,.  void* pCtx
12570 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
12580 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
12590 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
125a0 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
125b0 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
125c0 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
125d0 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
125e0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
125f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12600 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
12610 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
12620 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
12630 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
12640 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
12650 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
12660 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
12670 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
12680 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
12690 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
126a0 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
126b0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
126c0 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
126d0 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32  lly..  */.  enc2
126e0 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61   = enc;.  testca
126f0 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
12700 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74  _UTF16 );.  test
12710 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
12720 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
12730 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d   );.  if( enc2==
12740 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20  SQLITE_UTF16 || 
12750 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
12760 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20  16_ALIGNED ){.  
12770 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f    enc2 = SQLITE_
12780 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
12790 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49  .  if( enc2<SQLI
127a0 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e  TE_UTF8 || enc2>
127b0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
127c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
127d0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
127e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
127f0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   if this call is
12800 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70   removing or rep
12810 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69  lacing an existi
12820 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20  ng collation .  
12830 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20  ** sequence. If 
12840 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  so, and there ar
12850 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65  e active VMs, re
12860 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68  turn busy. If th
12870 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20  ere.  ** are no 
12880 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61  active VMs, inva
12890 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63  lidate any pre-c
128a0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
128b0 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c  ts..  */.  pColl
128c0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
128d0 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
128e0 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  c2, zName, 0);. 
128f0 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
12900 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
12910 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
12920 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
12930 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
12940 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
12950 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
12960 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
12970 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  dify collation s
12980 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61  equence due to a
12990 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
129a0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
129b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
129c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
129d0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
129e0 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20  tements(db);..  
129f0 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f    /* If collatio
12a00 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
12a10 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72   was created dir
12a20 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20  ectly by a call 
12a30 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
12a40 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
12a50 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65  on, and not gene
12a60 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f  rated by synthCo
12a70 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20  llSeq(),.    ** 
12a80 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20  then any copies 
12a90 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c  made by synthCol
12aa0 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62  lSeq() need to b
12ab0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20  e invalidated.. 
12ac0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c     ** Also, coll
12ad0 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72  ation destructor
12ae0 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28   - CollSeq.xDel(
12af0 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  ) - function may
12b00 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
12b10 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  be called..    *
12b20 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c  / .    if( (pCol
12b30 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45  l->enc & ~SQLITE
12b40 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d  _UTF16_ALIGNED)=
12b50 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43  =enc2 ){.      C
12b60 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20  ollSeq *aColl = 
12b70 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
12b80 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a  &db->aCollSeq, z
12b90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  Name);.      int
12ba0 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
12bb0 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
12bc0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
12bd0 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20   = &aColl[j];.  
12be0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63        if( p->enc
12bf0 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
12c00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
12c10 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  >xDel ){.       
12c20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e       p->xDel(p->
12c30 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pUser);.        
12c40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
12c50 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  >xCmp = 0;.     
12c60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12c70 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20   }.  }..  pColl 
12c80 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
12c90 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
12ca0 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20  2, zName, 1);.  
12cb0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72  if( pColl==0 ) r
12cc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12cd0 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d  EM;.  pColl->xCm
12ce0 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20  p = xCompare;.  
12cf0 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70  pColl->pUser = p
12d00 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44  Ctx;.  pColl->xD
12d10 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f  el = xDel;.  pCo
12d20 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65  ll->enc = (u8)(e
12d30 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c  nc2 | (enc & SQL
12d40 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
12d50 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  D));.  sqlite3Er
12d60 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
12d70 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  K);.  return SQL
12d80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
12d90 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66  * This array def
12da0 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20  ines hard upper 
12db0 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20  bounds on limit 
12dc0 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20  values.  The.** 
12dd0 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74  initializer must
12de0 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63   be kept in sync
12df0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
12e00 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66  _LIMIT_*.** #def
12e10 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e  ines in sqlite3.
12e20 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  h..*/.static con
12e30 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69  st int aHardLimi
12e40 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45  t[] = {.  SQLITE
12e50 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _MAX_LENGTH,.  S
12e60 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
12e70 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
12e80 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c  AX_COLUMN,.  SQL
12e90 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
12ea0 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
12eb0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
12ec0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
12ed0 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45  DBE_OP,.  SQLITE
12ee0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
12ef0 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  G,.  SQLITE_MAX_
12f00 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49  ATTACHED,.  SQLI
12f10 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
12f20 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  ERN_LENGTH,.  SQ
12f30 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
12f40 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f  E_NUMBER,      /
12f50 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33  * IMP: R-38091-3
12f60 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45  2352 */.  SQLITE
12f70 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
12f80 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
12f90 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c  _WORKER_THREADS,
12fa0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
12fb0 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69  sure the hard li
12fc0 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20  mits are set to 
12fd0 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65  reasonable value
12fe0 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  s.*/.#if SQLITE_
12ff0 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  MAX_LENGTH<100.#
13000 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13010 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  X_LENGTH must be
13020 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
13030 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13040 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31  MAX_SQL_LENGTH<1
13050 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
13060 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
13070 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13080 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
13090 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
130a0 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41  LENGTH>SQLITE_MA
130b0 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72  X_LENGTH.# error
130c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
130d0 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20  LENGTH must not 
130e0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
130f0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13100 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  H.#endif.#if SQL
13110 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
13120 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f  _SELECT<2.# erro
13130 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  r SQLITE_MAX_COM
13140 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73  POUND_SELECT mus
13150 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a  t be at least 2.
13160 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13170 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30  E_MAX_VDBE_OP<40
13180 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13190 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74  MAX_VDBE_OP must
131a0 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a   be at least 40.
131b0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
131c0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
131d0 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  RG<0 || SQLITE_M
131e0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e  AX_FUNCTION_ARG>
131f0 31 32 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  127.# error SQLI
13200 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
13210 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77  ARG must be betw
13220 65 65 6e 20 30 20 61 6e 64 20 31 32 37 0a 23 65  een 0 and 127.#e
13230 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13240 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c  MAX_ATTACHED<0 |
13250 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  | SQLITE_MAX_ATT
13260 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f  ACHED>125.# erro
13270 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  r SQLITE_MAX_ATT
13280 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65  ACHED must be be
13290 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a  tween 0 and 125.
132a0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
132b0 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
132c0 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
132d0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
132e0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
132f0 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
13300 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
13310 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
13320 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72  MN>32767.# error
13330 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
13340 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  MN must not exce
13350 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a  ed 32767.#endif.
13360 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  #if SQLITE_MAX_T
13370 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23  RIGGER_DEPTH<1.#
13380 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13390 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
133a0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
133b0 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
133c0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
133d0 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c  THREADS<0 || SQL
133e0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
133f0 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f  HREADS>50.# erro
13400 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  r SQLITE_MAX_WOR
13410 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74  KER_THREADS must
13420 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
13430 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  d 50.#endif.../*
13440 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
13450 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e  alue of a limit.
13460 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64    Report the old
13470 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e   value..** If an
13480 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69   invalid limit i
13490 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64  ndex is supplied
134a0 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20  , report -1..** 
134b0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
134c0 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74  but still report
134d0 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69   the old value i
134e0 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d  f the.** new lim
134f0 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
13500 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65  **.** A new lowe
13510 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74  r limit does not
13520 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67   shrink existing
13530 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20   constructs..** 
13540 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e  It merely preven
13550 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74  ts new construct
13560 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68  s that exceed th
13570 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20  e limit.** from 
13580 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  forming..*/.int 
13590 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71  sqlite3_limit(sq
135a0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c  lite3 *db, int l
135b0 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c  imitId, int newL
135c0 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64  imit){.  int old
135d0 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53  Limit;..#ifdef S
135e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
135f0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
13600 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
13610 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
13620 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
13630 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
13640 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
13650 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  f..  /* EVIDENCE
13660 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
13670 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
13680 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
13690 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
136a0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
136b0 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
136c0 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
136d0 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
136e0 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
136f0 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
13700 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
13710 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
13720 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
13730 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
13740 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13750 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13760 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
13770 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
13780 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13790 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
137a0 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
137b0 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
137c0 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
137d0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
137e0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
137f0 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
13800 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
13810 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13820 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13830 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
13840 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
13850 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13860 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13870 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
13880 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
13890 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
138a0 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
138b0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
138c0 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
138d0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
138e0 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
138f0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13900 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
13910 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
13920 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
13930 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
13940 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13950 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
13960 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
13970 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
13980 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13990 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
139a0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
139b0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
139f0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
13a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13a10 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13a20 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
13a30 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
13a40 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
13a50 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
13a60 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13a70 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
13a80 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
13a90 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
13aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13ab0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
13ac0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
13ad0 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  DS]==SQLITE_MAX_
13ae0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29  WORKER_THREADS )
13af0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
13b00 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
13b10 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45  THREADS==(SQLITE
13b20 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a  _N_LIMIT-1) );..
13b30 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30  .  if( limitId<0
13b40 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c   || limitId>=SQL
13b50 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20  ITE_N_LIMIT ){. 
13b60 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
13b70 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64  }.  oldLimit = d
13b80 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
13b90 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d  d];.  if( newLim
13ba0 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20  it>=0 ){        
13bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d             /* IM
13bc0 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32  P: R-52476-28732
13bd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c   */.    if( newL
13be0 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b  imit>aHardLimit[
13bf0 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20  limitId] ){.    
13c00 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61    newLimit = aHa
13c10 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
13c20 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34  ;  /* IMP: R-514
13c30 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20  63-25634 */.    
13c40 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74  }.    db->aLimit
13c50 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c  [limitId] = newL
13c60 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
13c70 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20  rn oldLimit;    
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31   /* IMP: R-53341
13ca0 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  -35419 */.}../*.
13cb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13cc0 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73   is used to pars
13cd0 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20  e both URIs and 
13ce0 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
13cf0 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a  s passed by the.
13d00 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66  ** user to API f
13d10 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33  unctions sqlite3
13d20 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
13d30 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e  e3_open_v2(), an
13d40 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a  d for database.*
13d50 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64  * URIs specified
13d60 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41   as part of ATTA
13d70 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CH statements..*
13d80 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
13d90 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
13da0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
13db0 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
13dc0 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20  to use (or.** a 
13dd0 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20  NULL to signify 
13de0 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29  the default VFS)
13df0 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73   if the URI does
13e00 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22   not contain a "
13e10 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72  vfs=xxx".** quer
13e20 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65  y parameter. The
13e30 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13e40 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52   contains the UR
13e50 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69  I (or non-URI fi
13e60 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c  lename).** itsel
13e70 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  f. When this fun
13e80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13e90 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69  the *pFlags vari
13ea0 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74  able should cont
13eb0 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  ain.** the defau
13ec0 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  lt flags to open
13ed0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
13ee0 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76  ndle with. The v
13ef0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
13f00 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65  * *pFlags may be
13f10 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20   updated before 
13f20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65  returning if the
13f30 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f   URI filename co
13f40 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68  ntains .** "cach
13f50 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d  e=xxx" or "mode=
13f60 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d  xxx" query param
13f70 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eters..**.** If 
13f80 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
13f90 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
13fa0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
13fb0 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f  *ppVfs is set to
13fc0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
13fd0 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64   VFS that should
13fe0 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e   be used to open
13ff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14000 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73  le. *pzFile is s
14010 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  et to.** point t
14020 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
14030 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  ining the name o
14040 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70  f the file to op
14050 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  en. It is the .*
14060 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
14070 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
14080 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c  o eventually cal
14090 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
140a0 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74   to release.** t
140b0 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  his buffer..**.*
140c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
140d0 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51  curs, then an SQ
140e0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
140f0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
14100 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79  *pzErrMsg.** may
14110 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
14120 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
14130 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69  taining an Engli
14140 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
14150 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49  r .** message. I
14160 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
14170 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
14180 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
14190 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  lly release.** t
141a0 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61  his buffer by ca
141b0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
141c0 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ee()..*/.int sql
141d0 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20  ite3ParseUri(.  
141e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66  const char *zDef
141f0 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20  aultVfs,        
14200 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66  /* VFS to use if
14210 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75   no "vfs=xxx" qu
14220 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ery option */.  
14230 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
14240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14250 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
14260 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a  d URI to parse *
14270 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
14280 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20   *pFlags,       
14290 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
142a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
142b0 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
142c0 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20  3_vfs **ppVfs,  
142d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
142e0 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20  : VFS to use */ 
142f0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65  .  char **pzFile
14300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14310 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e     /* OUT: Filen
14320 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ame component of
14330 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a   URI */.  char *
14340 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20  *pzErrMsg       
14350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
14360 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  : Error message 
14370 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (if rc!=SQLITE_O
14380 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  K) */.){.  int r
14390 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
143a0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
143b0 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20  ags = *pFlags;. 
143c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
143d0 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b  s = zDefaultVfs;
143e0 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
143f0 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20    char c;.  int 
14400 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nUri = sqlite3St
14410 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20  rlen30(zUri);.. 
14420 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d   assert( *pzErrM
14430 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  sg==0 );..  if( 
14440 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
14450 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20  _OPEN_URI)      
14460 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
14470 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a  -48725-32206 */.
14480 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
14490 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
144a0 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20  ig.bOpenUri) /* 
144b0 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35  IMP: R-51689-465
144c0 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69  48 */.   && nUri
144d0 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55  >=5 && memcmp(zU
144e0 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d  ri, "file:", 5)=
144f0 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38  =0 /* IMP: R-578
14500 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b  84-37496 */.  ){
14510 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b  .    char *zOpt;
14520 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b  .    int eState;
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61     /* Parser sta
14550 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  te when parsing 
14560 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  URI */.    int i
14570 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
14580 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
14590 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
145a0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  x */.    int iOu
145b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
145c0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
145d0 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
145e0 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74   */.    u64 nByt
145f0 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20  e = nUri+2;     
14600 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
14610 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
14620 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  ate */..    /* M
14630 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c  ake sure the SQL
14640 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61  ITE_OPEN_URI fla
14650 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69  g is set to indi
14660 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20  cate to the VFS 
14670 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65  xOpen .    ** me
14680 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20  thod that there 
14690 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72  may be extra par
146a0 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e  ameters followin
146b0 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e  g the file-name.
146c0 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c    */.    flags |
146d0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  = SQLITE_OPEN_UR
146e0 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d  I;..    for(iIn=
146f0 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e  0; iIn<nUri; iIn
14700 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55  ++) nByte += (zU
14710 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20  ri[iIn]=='&');. 
14720 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
14730 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
14740 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  e);.    if( !zFi
14750 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
14760 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69  TE_NOMEM;..    i
14770 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20 53  In = 5;.#ifdef S
14780 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f  QLITE_ALLOW_URI_
14790 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69 66  AUTHORITY.    if
147a0 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35  ( strncmp(zUri+5
147b0 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29  , "///", 3)==0 )
147c0 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
147d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
147e0 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f  llowing conditio
147f0 6e 20 63 61 75 73 65 73 20 55 52 49 73 20 77 69  n causes URIs wi
14800 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67 20  th five leading 
14810 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
14820 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a     ** like file:
14830 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74  /////host/path t
14840 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  o be converted i
14850 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f  nto UNCs like //
14860 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20 20  host/path..     
14870 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20   ** The correct 
14880 55 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e 43  URI for that UNC
14890 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72   has only two or
148a0 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f 20   four leading / 
148b0 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20  characters.     
148c0 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f   ** file://host/
148d0 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f  path or file:///
148e0 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75 74  /host/path.  But
148f0 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68   5 leading slash
14900 65 73 20 69 73 20 61 20 0a 20 20 20 20 20 20 2a  es is a .      *
14910 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20  * common error, 
14920 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20  we are told, so 
14930 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73 20  we handle it as 
14940 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 20  a special case. 
14950 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  */.      if( str
14960 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f  ncmp(zUri+7, "//
14970 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e  /", 3)==0 ){ iIn
14980 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20  ++; }.    }else 
14990 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
149a0 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74  +5, "//localhost
149b0 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20  /", 12)==0 ){.  
149c0 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20      iIn = 16;.  
149d0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
149e0 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68   Discard the sch
149f0 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74  eme and authorit
14a00 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68  y segments of th
14a10 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66  e URI. */.    if
14a20 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26  ( zUri[5]=='/' &
14a30 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29  & zUri[6]=='/' )
14a40 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
14a50 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55  .      while( zU
14a60 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
14a70 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b  iIn]!='/' ) iIn+
14a80 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e  +;.      if( iIn
14a90 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20  !=7 && (iIn!=16 
14aa0 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c  || memcmp("local
14ab0 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c  host", &zUri[7],
14ac0 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   9)) ){.        
14ad0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
14ae0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
14af0 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69  alid uri authori
14b00 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20  ty: %.*s", .    
14b10 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26          iIn-7, &
14b20 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20  zUri[7]);.      
14b30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
14b40 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ROR;.        got
14b50 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
14b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
14b70 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
14b80 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  py the filename 
14b90 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61  and any query pa
14ba0 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68  rameters into th
14bb0 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20  e zFile buffer. 
14bc0 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25  .    ** Decode %
14bd0 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20  HH escape codes 
14be0 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a  along the way. .
14bf0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69      **.    ** Wi
14c00 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20  thin this loop, 
14c10 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20  variable eState 
14c20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c  may be set to 0,
14c30 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69   1 or 2, dependi
14c40 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ng.    ** on the
14c50 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
14c60 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  . As follows:.  
14c70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a    **.    **   0:
14c80 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61   Parsing file-na
14c90 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20  me..    **   1: 
14ca0 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63  Parsing name sec
14cb0 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
14cc0 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
14cd0 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32  eter..    **   2
14ce0 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20  : Parsing value 
14cf0 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
14d00 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
14d10 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a  rameter..    */.
14d20 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a      eState = 0;.
14d30 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
14d40 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
14d50 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20   c!='#' ){.     
14d60 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
14d70 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20  ( c=='%' .      
14d80 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
14d90 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a  git(zUri[iIn]) .
14da0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
14db0 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
14dc0 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b  In+1]) .      ){
14dd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74  .        int oct
14de0 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78  et = (sqlite3Hex
14df0 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
14e00 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20  ]) << 4);.      
14e10 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74    octet += sqlit
14e20 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
14e30 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20  iIn++]);..      
14e40 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e    assert( octet>
14e50 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20  =0 && octet<256 
14e60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  );.        if( o
14e70 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ctet==0 ){.     
14e80 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
14e90 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14ea0 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20  n "%00" appears 
14eb0 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20  within the URI. 
14ec0 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  In this.        
14ed0 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e    ** case we ign
14ee0 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20  ore all text in 
14ef0 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
14f00 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20   the path, name 
14f10 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
14f20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
14f30 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f  being parsed. So
14f40 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72   ignore the curr
14f50 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20  ent character.  
14f60 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73          ** and s
14f70 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  kip to the next 
14f80 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c  "?", "=" or "&",
14f90 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
14fa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
14fb0 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
14fc0 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
14fd0 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
14fe0 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c   && (eState!=0 |
14ff0 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20  | c!='?').      
15000 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
15010 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27  te!=1 || (c!='='
15020 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20   && c!='&')).   
15030 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
15040 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27  State!=2 || c!='
15050 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  &').          ){
15060 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
15070 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
15080 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
15090 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
150a0 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b        c = octet;
150b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
150c0 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63   eState==1 && (c
150d0 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29  =='&' || c=='=')
150e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
150f0 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30  zFile[iOut-1]==0
15100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
15110 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e   An empty option
15120 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68   name. Ignore th
15130 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65  is option altoge
15140 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ther. */.       
15150 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
15160 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
15170 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49  !='#' && zUri[iI
15180 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b  n-1]!='&' ) iIn+
15190 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
151a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
151b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
151c0 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '&' ){.         
151d0 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
151e0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\0';.        }
151f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15200 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
15210 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
15220 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
15230 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20   if( (eState==0 
15240 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65  && c=='?') || (e
15250 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27  State==2 && c=='
15260 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  &') ){.        c
15270 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53   = 0;.        eS
15280 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
15290 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f  }.      zFile[iO
152a0 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d  ut++] = c;.    }
152b0 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d  .    if( eState=
152c0 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  =1 ) zFile[iOut+
152d0 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
152e0 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
152f0 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
15300 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a  Out++] = '\0';..
15310 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
15320 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f  there were any o
15330 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64  ptions specified
15340 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
15350 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20  interpreted .   
15360 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e   ** here. Option
15370 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72  s that are inter
15380 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c  preted here incl
15390 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68  ude "vfs" and th
153a0 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ose that.    ** 
153b0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c  correspond to fl
153c0 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ags that may be 
153d0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71  passed to the sq
153e0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a  lite3_open_v2().
153f0 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a      ** method. *
15400 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46  /.    zOpt = &zF
15410 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ile[sqlite3Strle
15420 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20  n30(zFile)+1];. 
15430 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30     while( zOpt[0
15440 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ] ){.      int n
15450 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Opt = sqlite3Str
15460 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20  len30(zOpt);.   
15470 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20     char *zVal = 
15480 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20  &zOpt[nOpt+1];. 
15490 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20       int nVal = 
154a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
154b0 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66  zVal);..      if
154c0 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d  ( nOpt==3 && mem
154d0 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c  cmp("vfs", zOpt,
154e0 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
154f0 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20    zVfs = zVal;. 
15500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15510 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d      struct OpenM
15520 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ode {.          
15530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
15540 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
15550 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d  e;.        } *aM
15560 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
15570 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65   char *zModeType
15580 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
15590 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  t mask = 0;.    
155a0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
155b0 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  0;..        if( 
155c0 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d  nOpt==5 && memcm
155d0 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c  p("cache", zOpt,
155e0 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   5)==0 ){.      
155f0 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
15600 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68  t OpenMode aCach
15610 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eMode[] = {.    
15620 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65          { "share
15630 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  d",  SQLITE_OPEN
15640 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a  _SHAREDCACHE },.
15650 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70              { "p
15660 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  rivate", SQLITE_
15670 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
15680 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
15690 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
156a0 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
156b0 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
156c0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
156d0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  |SQLITE_OPEN_PRI
156e0 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20  VATECACHE;.     
156f0 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61       aMode = aCa
15700 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  cheMode;.       
15710 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b     limit = mask;
15720 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
15730 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a  Type = "cache";.
15740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15750 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26    if( nOpt==4 &&
15760 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20   memcmp("mode", 
15770 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  zOpt, 4)==0 ){. 
15780 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
15790 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
157a0 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  aOpenMode[] = {.
157b0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
157c0 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  o",  SQLITE_OPEN
157d0 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20  _READONLY },.   
157e0 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c           { "rw",
157f0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
15800 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20  ADWRITE }, .    
15810 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c          { "rwc",
15820 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15830 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
15840 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
15850 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65             { "me
15860 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50  mory", SQLITE_OP
15870 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20  EN_MEMORY },.   
15880 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
15890 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
158a0 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
158b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
158c0 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f  DONLY | SQLITE_O
158d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
15900 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
15910 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20  PEN_MEMORY;.    
15920 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f        aMode = aO
15930 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  penMode;.       
15940 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20     limit = mask 
15950 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  & flags;.       
15960 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
15970 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20  access";.       
15980 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
15990 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  aMode ){.       
159a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
159b0 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30      int mode = 0
159c0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
159d0 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  i=0; aMode[i].z;
159e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
159f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15a00 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20   = aMode[i].z;. 
15a10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
15a20 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  Val==sqlite3Strl
15a30 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65  en30(z) && 0==me
15a40 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56  mcmp(zVal, z, nV
15a50 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
15a60 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64       mode = aMod
15a70 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20  e[i].mode;.     
15a80 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15a90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
15aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15ab0 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20      if( mode==0 
15ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
15ad0 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
15ae0 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
15af0 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22  uch %s mode: %s"
15b00 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61  , zModeType, zVa
15b10 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
15b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
15b30 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  R;.            g
15b40 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
15b50 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
15b60 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f           if( (mo
15b70 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  de & ~SQLITE_OPE
15b80 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20  N_MEMORY)>limit 
15b90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
15ba0 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
15bb0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d  e3_mprintf("%s m
15bc0 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a  ode not allowed:
15bd0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d                zM
15c00 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
15c10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
15c20 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
15c30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
15c40 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
15c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15c60 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61      flags = (fla
15c70 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f  gs & ~mask) | mo
15c80 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  de;.        }.  
15c90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70      }..      zOp
15ca0 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31  t = &zVal[nVal+1
15cb0 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  ];.    }..  }els
15cc0 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73  e{.    zFile = s
15cd0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
15ce0 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28  nUri+2);.    if(
15cf0 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
15d00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15d10 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c     memcpy(zFile,
15d20 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
15d30 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20    zFile[nUri] = 
15d40 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
15d50 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nUri+1] = '\0';.
15d60 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
15d70 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
15d80 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73   }..  *ppVfs = s
15d90 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
15da0 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70  zVfs);.  if( *pp
15db0 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Vfs==0 ){.    *p
15dc0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
15dd0 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
15de0 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66  ch vfs: %s", zVf
15df0 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  s);.    rc = SQL
15e00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
15e10 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20  parse_uri_out:. 
15e20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15e30 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
15e40 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  3_free(zFile);. 
15e50 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20     zFile = 0;.  
15e60 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c  }.  *pFlags = fl
15e70 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d  ags;.  *pzFile =
15e80 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e   zFile;.  return
15e90 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
15ea0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
15eb0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
15ec0 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
15ed0 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
15ee0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
15ef0 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
15f00 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
15f10 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
15f20 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
15f30 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
15f40 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
15f50 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
15f60 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
15f70 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
15f80 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
15f90 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
15fa0 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
15fb0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
15fc0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
15fd0 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
15fe0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f   int flags,    /
15ff0 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
16000 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
16010 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
16020 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
16030 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
16040 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63    /* Store alloc
16070 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65  ated handle here
16080 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
160b0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
160c0 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20  Threadsafe;     
160d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
160e0 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65  e for threadsafe
160f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
16100 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20    char *zOpen = 
16110 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16120 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72    /* Filename ar
16130 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
16140 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f  o BtreeOpen() */
16150 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
16160 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16170 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
16180 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  age from sqlite3
16190 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23  ParseUri() */..#
161a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
161b0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
161c0 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
161d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
161e0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
161f0 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
16200 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16210 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
16220 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
16230 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
16240 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
16250 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61  dif..  /* Only a
16260 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f  llow sensible co
16270 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69  mbinations of bi
16280 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  ts in the flags 
16290 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a  argument.  .  **
162a0 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
162b0 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65  if any non-sense
162c0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20   combination is 
162d0 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a  used.  If we.  *
162e0 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69  * do not block i
162f0 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69  llegal combinati
16300 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75  ons here, it cou
16310 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20  ld trigger.  ** 
16320 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
16330 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61  nts in deeper la
16340 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20  yers.  Sensible 
16350 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a  combinations.  *
16360 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  * are:.  **.  **
16370 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    1:  SQLITE_OPE
16380 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  N_READONLY.  ** 
16390 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   2:  SQLITE_OPEN
163a0 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20  _READWRITE.  ** 
163b0 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   6:  SQLITE_OPEN
163c0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
163d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
163e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53    */.  assert( S
163f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
16400 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
16410 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
16420 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
16430 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
16440 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
16450 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
16460 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
16470 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
16480 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
16490 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
164a0 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
164b0 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
164c0 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
164d0 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
164e0 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
164f0 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
16500 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
16510 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
16520 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20  & 0x46)==0 ){.  
16530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16540 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a  MISUSE_BKPT;  /*
16550 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34 34   IMP: R-65497-44
16560 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66  594 */.  }..  if
16570 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16580 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
16590 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
165a0 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
165b0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
165c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
165d0 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
165e0 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
165f0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
16600 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
16610 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
16620 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
16630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
16640 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
16650 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16660 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
16670 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
16680 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
16690 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66  TECACHE ){.    f
166a0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
166b0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
166c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
166d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
166e0 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
166f0 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67  bled ){.    flag
16700 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
16710 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
16720 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68  }..  /* Remove h
16730 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d  armful bits from
16740 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
16750 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  eter.  **.  ** T
16760 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  he SQLITE_OPEN_N
16770 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54  OMUTEX and SQLIT
16780 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
16790 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a   flags were.  **
167a0 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74   dealt with in t
167b0 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
167c0 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73   block.  Besides
167d0 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79   these, the only
167e0 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75  .  ** valid inpu
167f0 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  t flags for sqli
16800 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72  te3_open_v2() ar
16810 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  e SQLITE_OPEN_RE
16820 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c  ADONLY,.  ** SQL
16830 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16840 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  TE, SQLITE_OPEN_
16850 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f  CREATE, SQLITE_O
16860 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c  PEN_SHAREDCACHE,
16870 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
16880 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20  N_PRIVATECACHE, 
16890 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65  and some reserve
168a0 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c  d bits.  Silentl
168b0 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20  y mask.  ** off 
168c0 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e  all other flags.
168d0 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d  .  */.  flags &=
168e0 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ~( SQLITE_OPEN
168f0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
16900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16910 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
16920 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
16930 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16940 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20  EN_MAIN_DB |.   
16950 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16960 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
16970 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
16980 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52    SQLITE_OPEN_TR
16990 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20  ANSIENT_DB | .  
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
169b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
169c0 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
169d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
169e0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
169f0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
16a00 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
16a10 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  UBJOURNAL | .   
16a20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16a30 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
16a40 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20  OURNAL |.       
16a50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16a60 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20  PEN_NOMUTEX |.  
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16a80 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
16a90 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
16aa0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16ab0 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WAL.            
16ac0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
16ad0 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61  te the sqlite da
16ae0 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ta structure */.
16af0 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61    db = sqlite3Ma
16b00 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
16b10 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69  (sqlite3) );.  i
16b20 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20  f( db==0 ) goto 
16b30 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66  opendb_out;.  if
16b40 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29  ( isThreadsafe )
16b50 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20  {.    db->mutex 
16b60 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
16b70 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
16b80 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
16b90 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d   if( db->mutex==
16ba0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
16bb0 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20  e3_free(db);.   
16bc0 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20     db = 0;.     
16bd0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
16be0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
16bf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
16c00 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
16c10 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78  db->errMask = 0x
16c20 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ff;.  db->nDb = 
16c30 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
16c40 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
16c50 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
16c60 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a  db->aDbStatic;..
16c70 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16c80 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69  (db->aLimit)==si
16c90 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29  zeof(aHardLimit)
16ca0 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d   );.  memcpy(db-
16cb0 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69  >aLimit, aHardLi
16cc0 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e  mit, sizeof(db->
16cd0 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e  aLimit));.  db->
16ce0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
16cf0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
16d00 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  DS] = SQLITE_DEF
16d10 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  AULT_WORKER_THRE
16d20 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  ADS;.  db->autoC
16d30 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
16d40 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
16d50 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  1;.  db->szMmap 
16d60 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
16d70 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
16d80 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
16d90 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78   = 0;.  db->nMax
16da0 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37  SorterMmap = 0x7
16db0 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66  FFFFFFF;.  db->f
16dc0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
16dd0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
16de0 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
16df0 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63  ger | SQLITE_Cac
16e00 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66  heSpill.#if !def
16e10 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
16e20 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
16e30 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44  DEX) || SQLITE_D
16e40 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
16e50 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20  _INDEX.         
16e60 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
16e70 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69  _AutoIndex.#endi
16e80 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
16e90 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59  AULT_CKPTFULLFSY
16ea0 4e 43 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  NC.             
16eb0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70      | SQLITE_Ckp
16ec0 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69  tFullFSync.#endi
16ed0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
16ee0 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
16ef0 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <4.             
16f00 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67      | SQLITE_Leg
16f10 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69  acyFileFmt.#endi
16f20 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
16f30 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
16f40 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  NSION.          
16f50 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
16f60 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65  LoadExtension.#e
16f70 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
16f80 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56  DEFAULT_RECURSIV
16f90 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20  E_TRIGGERS.     
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16fb0 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
16fc0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
16fd0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
16fe0 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29  LT_FOREIGN_KEYS)
16ff0 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55   && SQLITE_DEFAU
17000 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a  LT_FOREIGN_KEYS.
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   | SQLITE_Foreig
17030 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66  nKeys.#endif.#if
17040 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17050 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45  REVERSE_UNORDERE
17060 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20  D_SELECTS).     
17070 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17080 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
17090 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  r.#endif.#if def
170a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
170b0 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
170c0 5f 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20  _CHECK).        
170d0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
170e0 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e  E_CellSizeCk.#en
170f0 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
17100 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
17110 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
17120 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17130 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
17140 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
17150 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
17160 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
17170 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
17180 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
17190 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77  BINARY. BINARY w
171a0 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54  orks for both UT
171b0 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46  F-8.  ** and UTF
171c0 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65  -16, so add a ve
171d0 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  rsion for each t
171e0 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65  o avoid any unne
171f0 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e  cessary.  ** con
17200 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  versions. The on
17210 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61  ly error that ca
17220 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20  n occur here is 
17230 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
17240 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56  re..  **.  ** EV
17250 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37  IDENCE-OF: R-527
17260 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20  86-44878 SQLite 
17270 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75  defines three bu
17280 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
17290 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  .  ** functions:
172a0 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
172b0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
172c0 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
172d0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
172e0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
172f0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
17300 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
17310 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
17320 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
17330 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
17340 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
17350 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
17360 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  Y, SQLITE_UTF16L
17370 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
17380 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
17390 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
173a0 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
173b0 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
173c0 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
173d0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
173e0 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
173f0 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
17400 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
17410 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
17420 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17430 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
17440 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45  _out;.  }.  /* E
17450 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
17460 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65  308-17224 The de
17470 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
17480 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  function for all
17490 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73  .  ** strings is
174a0 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20   BINARY. .  */. 
174b0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
174c0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
174d0 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
174e0 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42  TF8, sqlite3StrB
174f0 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73  INARY, 0);.  ass
17500 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
17510 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50  ll!=0 );..  /* P
17520 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
17530 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20  e/URI argument. 
17540 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
17550 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63  gs = flags;.  rc
17560 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
17570 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
17580 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
17590 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
175a0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
175b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
175c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
175d0 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69  ITE_NOMEM ) sqli
175e0 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
175f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17600 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
17610 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
17620 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
17630 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17640 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
17650 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17660 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
17670 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
17680 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
17690 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
176a0 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
176b0 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
176c0 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176e0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
176f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
17700 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
17710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
17720 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
17730 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
17740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17750 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
17760 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
17770 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f   rc);.    goto o
17780 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
17790 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
177a0 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
177b0 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  t);.  db->aDb[0]
177c0 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
177d0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
177e0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
177f0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17800 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64  ocFailed ) ENC(d
17810 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28  b) = SCHEMA_ENC(
17820 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
17830 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62  reeLeave(db->aDb
17840 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
17850 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
17860 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
17870 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  t(db, 0);..  /* 
17880 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
17890 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
178a0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
178b0 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68  s 'full'; for th
178c0 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61  e temp.  ** data
178d0 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45  base it is 'NONE
178e0 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  '. This matches 
178f0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
17900 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
17910 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e  .  db->aDb[0].zN
17920 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
17930 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
17940 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64  y_level = 3;.  d
17950 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20  b->aDb[1].zName 
17960 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e  = "temp";.  db->
17970 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[1].safety_le
17980 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e  vel = 1;..  db->
17990 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
179a0 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
179b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
179c0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
179d0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
179e0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
179f0 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
17a00 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
17a10 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
17a20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
17a30 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
17a40 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
17a50 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
17a60 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
17a70 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
17a80 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
17a90 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
17aa0 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  _OK);.  sqlite3R
17ab0 65 67 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63  egisterPerConnec
17ac0 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74  tionBuiltinFunct
17ad0 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ions(db);..  /* 
17ae0 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65  Load automatic e
17af0 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65  xtensions - exte
17b00 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  nsions that have
17b10 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
17b20 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
17b30 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69  sqlite3_automati
17b40 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50  c_extension() AP
17b50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  I..  */.  rc = s
17b60 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
17b70 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  b);.  if( rc==SQ
17b80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
17b90 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78  qlite3AutoLoadEx
17ba0 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20  tensions(db);.  
17bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
17bc0 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20  rrcode(db);.    
17bd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17be0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
17bf0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
17c00 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
17c10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31  LITE_ENABLE_FTS1
17c20 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17c30 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
17c40 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
17c50 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74  e3Fts1Init(sqlit
17c60 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
17c70 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64  qlite3Fts1Init(d
17c80 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
17c90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17ca0 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20  ABLE_FTS2.  if( 
17cb0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
17cc0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
17cd0 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  OK ){.    extern
17ce0 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32   int sqlite3Fts2
17cf0 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
17d00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17d10 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts2Init(db);.  
17d20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
17d30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
17d40 54 53 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63  TS3 /* automatic
17d50 61 6c 6c 79 20 64 65 66 69 6e 65 64 20 62 79 20  ally defined by 
17d60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
17d70 53 34 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  S4 */.  if( !db-
17d80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
17d90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17da0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17db0 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a  e3Fts3Init(db);.
17dc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
17dd0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17de0 5f 46 54 53 35 0a 20 20 69 66 28 20 21 64 62 2d  _FTS5.  if( !db-
17df0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
17e00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17e10 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17e20 65 33 46 74 73 35 49 6e 69 74 28 64 62 29 3b 0a  e3Fts5Init(db);.
17e30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
17e40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17e50 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e  _ICU.  if( !db->
17e60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
17e70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17e80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17e90 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20  3IcuInit(db);.  
17ea0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
17eb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52   SQLITE_ENABLE_R
17ec0 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e  TREE.  if( !db->
17ed0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
17ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
17ef0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17f00 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20  RtreeInit(db);. 
17f10 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
17f20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17f30 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20 69 66  DBSTAT_VTAB.  if
17f40 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
17f50 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
17f60 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
17f70 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65 67  sqlite3DbstatReg
17f80 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23  ister(db);.  }.#
17f90 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
17fa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  LITE_ENABLE_JSON
17fb0 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  1.  if( !db->mal
17fc0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
17fd0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
17fe0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f   rc = sqlite3Jso
17ff0 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  n1Init(db);.  }.
18000 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53  #endif..  /* -DS
18010 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
18020 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
18030 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
18040 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
18050 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
18060 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
18070 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
18080 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
18090 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
180a0 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
180b0 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
180c0 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
180d0 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
180e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
180f0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
18100 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
18110 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
18120 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
18130 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
18140 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
18150 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
18160 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
18170 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18190 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
181a0 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
181b0 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73  if..  if( rc ) s
181c0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
181d0 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c  rc);..  /* Enabl
181e0 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
181f0 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
18200 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61   */.  setupLooka
18210 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69  side(db, 0, sqli
18220 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18230 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20  szLookaside,.   
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18250 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
18260 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
18270 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ide);..  sqlite3
18280 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
18290 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  int(db, SQLITE_D
182a0 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
182b0 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65  HECKPOINT);..ope
182c0 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ndb_out:.  if( d
182d0 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
182e0 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
182f0 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
18300 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
18310 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18320 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30  ig.bFullMutex==0
18330 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
18340 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
18350 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63  mutex);.  }.  rc
18360 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
18370 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  de(db);.  assert
18380 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  ( db!=0 || rc==S
18390 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
183a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
183b0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
183c0 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
183d0 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65      db = 0;.  }e
183e0 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
183f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
18400 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
18410 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a  MAGIC_SICK;.  }.
18420 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69    *ppDb = db;.#i
18430 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18440 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
18450 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18460 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
18470 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20     /* Opening a 
18480 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74  db handle. Fourt
18490 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  h parameter is p
184a0 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20  assed 0. */.    
184b0 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c  void *pArg = sql
184c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
184d0 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20  .pSqllogArg;.   
184e0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
184f0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72  nfig.xSqllog(pAr
18500 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65  g, db, zFilename
18510 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
18520 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
18530 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20  ITE_HAS_CODEC). 
18540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18550 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
18560 63 68 61 72 20 2a 7a 48 65 78 4b 65 79 20 3d 20  char *zHexKey = 
18570 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
18580 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65  meter(zOpen, "he
18590 78 6b 65 79 22 29 3b 0a 20 20 20 20 69 66 28 20  xkey");.    if( 
185a0 7a 48 65 78 4b 65 79 20 26 26 20 7a 48 65 78 4b  zHexKey && zHexK
185b0 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 75  ey[0] ){.      u
185c0 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69  8 iByte;.      i
185d0 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72  nt i;.      char
185e0 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20   zKey[40];.     
185f0 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d   for(i=0, iByte=
18600 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79  0; i<sizeof(zKey
18610 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73  )*2 && sqlite3Is
18620 78 64 69 67 69 74 28 7a 48 65 78 4b 65 79 5b 69  xdigit(zHexKey[i
18630 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
18640 20 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65    iByte = (iByte
18650 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65  <<4) + sqlite3He
18660 78 54 6f 49 6e 74 28 7a 48 65 78 4b 65 79 5b 69  xToInt(zHexKey[i
18670 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
18680 28 69 26 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b  (i&1)!=0 ) zKey[
18690 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20  i/2] = iByte;.  
186a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
186b0 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30  te3_key_v2(db, 0
186c0 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20  , zKey, i/2);.  
186d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
186e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
186f0 70 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pen);.  return r
18700 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a  c & 0xff;.}../*.
18710 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
18720 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
18730 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
18740 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
18750 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
18760 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a  sqlite3 **ppDb .
18770 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
18780 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
18790 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  me, ppDb,.      
187a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
187c0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
187d0 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
187e0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  }.int sqlite3_op
187f0 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63  en_v2(.  const c
18800 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20  har *filename,  
18810 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
18820 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f  ename (UTF-8) */
18830 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
18840 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  b,         /* OU
18850 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e  T: SQLite db han
18860 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dle */.  int fla
18870 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
18880 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63   /* Flags */.  c
18890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
188a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
188b0 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20  f VFS module to 
188c0 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  use */.){.  retu
188d0 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
188e0 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20  filename, ppDb, 
188f0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c  (unsigned int)fl
18900 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23  ags, zVfs);.}..#
18910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18920 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f  IT_UTF16./*.** O
18930 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
18940 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
18950 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  t sqlite3_open16
18960 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  (.  const void *
18970 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
18980 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a  lite3 **ppDb.){.
18990 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
189a0 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a  ilename8;   /* z
189b0 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64  Filename encoded
189c0 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61   in UTF-8 instea
189d0 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20  d of UTF-16 */. 
189e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
189f0 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVal;.  int rc;.
18a00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18a10 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
18a20 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20    if( ppDb==0 ) 
18a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
18a40 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
18a50 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23  f.  *ppDb = 0;.#
18a60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18a70 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63  IT_AUTOINIT.  rc
18a80 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69   = sqlite3_initi
18a90 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72  alize();.  if( r
18aa0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
18ab0 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c  endif.  if( zFil
18ac0 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65  ename==0 ) zFile
18ad0 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30  name = "\000\000
18ae0 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  ";.  pVal = sqli
18af0 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
18b00 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
18b10 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a  tStr(pVal, -1, z
18b20 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45  Filename, SQLITE
18b30 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51  _UTF16NATIVE, SQ
18b40 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
18b50 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c  zFilename8 = sql
18b60 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
18b70 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  al, SQLITE_UTF8)
18b80 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
18b90 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  e8 ){.    rc = o
18ba0 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
18bb0 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20  ename8, ppDb,.  
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
18be0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
18bf0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
18c00 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
18c10 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c  *ppDb || rc==SQL
18c20 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
18c30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18c40 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  OK && !DbHasProp
18c50 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44  erty(*ppDb, 0, D
18c60 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20  B_SchemaLoaded) 
18c70 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f  ){.      SCHEMA_
18c80 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43  ENC(*ppDb) = ENC
18c90 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45  (*ppDb) = SQLITE
18ca0 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
18cb0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18cd0 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  EM;.  }.  sqlite
18ce0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
18cf0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26  ;..  return rc &
18d00 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66 20   0xff;.}.#endif 
18d10 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
18d20 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
18d30 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
18d40 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18d50 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
18d60 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
18d70 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
18d80 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
18d90 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
18da0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
18db0 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
18dc0 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
18dd0 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
18de0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
18df0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
18e00 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75  void*).){.  retu
18e10 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
18e20 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64  e_collation_v2(d
18e30 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70  b, zName, enc, p
18e40 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
18e50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  );.}../*.** Regi
18e60 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
18e70 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
18e80 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
18e90 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
18ea0 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
18eb0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
18ec0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
18ed0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
18ee0 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
18ef0 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
18f00 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
18f10 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
18f20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
18f30 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
18f40 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
18f50 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65    int rc;..#ifde
18f60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18f70 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
18f80 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
18f90 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
18fa0 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  me==0 ) return S
18fb0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
18fc0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
18fd0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
18fe0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
18ff0 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
19000 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
19010 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
19020 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
19030 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
19040 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
19050 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
19060 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
19070 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
19080 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
19090 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
190a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
190b0 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
190c0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
190d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
190e0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
190f0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
19100 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
19110 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
19120 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
19130 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
19140 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20  ame,.  int enc, 
19150 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
19160 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
19170 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
19180 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
19190 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
191a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
191b0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a    char *zName8;.
191c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
191d0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
191e0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
191f0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
19200 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  || zName==0 ) re
19210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
19220 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
19230 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19240 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
19250 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
19260 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
19270 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69  .  zName8 = sqli
19280 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
19290 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
192a0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
192b0 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a    if( zName8 ){.
192c0 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43      rc = createC
192d0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
192e0 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  me8, (u8)enc, pC
192f0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
19300 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
19310 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b  ree(db, zName8);
19320 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
19330 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
19340 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
19350 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
19360 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
19370 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
19380 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
19390 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
193a0 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
193b0 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
193c0 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
193d0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
193e0 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
193f0 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
19400 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
19410 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
19420 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
19430 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
19440 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65  needed(.  sqlite
19450 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
19460 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
19470 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
19480 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69  eded)(void*,sqli
19490 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
194a0 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  p,const char*).)
194b0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
194c0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
194d0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
194e0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
194f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19500 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
19510 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
19520 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
19530 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
19540 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c  llNeeded = xColl
19550 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43  Needed;.  db->xC
19560 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b  ollNeeded16 = 0;
19570 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
19580 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
19590 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
195a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
195b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
195c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
195d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
195e0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
195f0 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
19600 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
19610 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
19620 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
19630 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
19640 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
19650 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
19660 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19670 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
19680 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
19690 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a  ation_needed16(.
196a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
196b0 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
196c0 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
196d0 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28  *xCollNeeded16)(
196e0 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
196f0 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
19700 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64  t void*).){.#ifd
19710 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19720 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
19730 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
19740 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
19750 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
19760 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
19770 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
19780 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
19790 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
197a0 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
197b0 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
197c0 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
197d0 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
197e0 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
197f0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
19800 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
19810 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
19820 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
19830 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
19840 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
19850 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19860 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
19870 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19880 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
19890 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
198a0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
198b0 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
198c0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
198d0 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
198e0 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
198f0 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
19900 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
19910 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
19920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19930 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19940 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
19950 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
19960 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19970 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
19980 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
19990 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
199a0 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
199b0 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
199c0 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
199d0 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
199e0 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
199f0 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
19a00 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
19a10 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
19a20 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
19a30 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74  ROLLBACK..*/.int
19a40 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
19a50 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  ocommit(sqlite3 
19a60 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
19a70 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
19a80 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
19a90 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
19aa0 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
19ab0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
19ac0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
19ad0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
19ae0 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
19af0 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Commit;.}../*.**
19b00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
19b10 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 73  outines are subs
19b20 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
19b30 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
19b40 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
19b50 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
19b60 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
19b70 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62  IOERR and possib
19b80 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
19b90 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
19ba0 65 79 20 73 65 72 76 65 20 74 77 6f 20 70 75 72  ey serve two pur
19bb0 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  poses:.**.**   1
19bc0 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f  .  Serve as a co
19bd0 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
19be0 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
19bf0 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72  nt in a debugger
19c00 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74  .**       to det
19c10 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e  ect when version
19c20 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
19c30 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  s occurs..**.** 
19c40 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c    2.  Invoke sql
19c50 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72  ite3_log() to pr
19c60 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65  ovide the source
19c70 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77   code location w
19c80 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20  here.**       a 
19c90 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
19ca0 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65  is first detecte
19cb0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
19cc0 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e  3CorruptError(in
19cd0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
19ce0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
19cf0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
19d00 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
19d10 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  log(SQLITE_CORRU
19d20 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT,.            
19d30 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72    "database corr
19d40 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25  uption at line %
19d50 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
19d70 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
19d80 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
19d90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
19da0 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  RUPT;.}.int sqli
19db0 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69  te3MisuseError(i
19dc0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
19dd0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
19de0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
19df0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
19e00 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55  _log(SQLITE_MISU
19e10 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  SE, .           
19e20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69     "misuse at li
19e30 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
19e40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19e50 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
19e60 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
19e70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19e80 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73  _MISUSE;.}.int s
19e90 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72  qlite3CantopenEr
19ea0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
19eb0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
19ec0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19ed0 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
19ee0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
19ef0 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20  _CANTOPEN, .    
19f00 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
19f10 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c  t open file at l
19f20 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
19f30 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
19f40 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
19f50 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
19f60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19f70 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a  E_CANTOPEN;.}...
19f80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19f90 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
19fa0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
19fb0 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
19fc0 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
19fd0 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
19fe0 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
19ff0 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
1a000 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
1a010 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
1a020 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
1a030 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
1a040 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
1a050 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
1a060 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
1a070 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
1a080 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
1a090 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
1a0a0 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
1a0b0 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
1a0c0 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
1a0d0 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
1a0e0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1a0f0 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
1a100 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
1a110 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
1a120 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
1a130 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
1a140 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
1a150 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62  .int sqlite3_tab
1a160 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
1a170 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ta(.  sqlite3 *d
1a180 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1a190 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1a1a0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
1a1b0 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
1a1c0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1a1d0 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c  ase name or NULL
1a1e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1a1f0 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *zTableName,   
1a200 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
1a210 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1a220 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20  *zColumnName,   
1a230 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
1a240 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
1a250 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20  **pzDataType,   
1a260 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c   /* OUTPUT: Decl
1a270 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a  ared data type *
1a280 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
1a290 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20  *pzCollSeq,     
1a2a0 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61  /* OUTPUT: Colla
1a2b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
1a2c0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f  me */.  int *pNo
1a2d0 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  tNull,          
1a2e0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1a2f0 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20  rue if NOT NULL 
1a300 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74  constraint exist
1a310 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69  s */.  int *pPri
1a320 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20  maryKey,        
1a330 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1a340 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72  ue if column par
1a350 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74  t of PK */.  int
1a360 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20   *pAutoinc      
1a370 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
1a380 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
1a390 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65  mn is auto-incre
1a3a0 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
1a3b0 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1a3c0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c  rMsg = 0;.  Tabl
1a3d0 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43  e *pTab = 0;.  C
1a3e0 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
1a3f0 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b  .  int iCol = 0;
1a400 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1a410 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
1a420 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1a430 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
1a440 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
1a450 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
1a460 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
1a470 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53   = 0;...#ifdef S
1a480 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1a490 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1a4a0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1a4b0 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65  Ok(db) || zTable
1a4c0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Name==0 ){.    r
1a4d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1a4e0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
1a4f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  ndif..  /* Ensur
1a500 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1a510 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c  chema has been l
1a520 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  oaded */.  sqlit
1a530 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1a540 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c  b->mutex);.  sql
1a550 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
1a560 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  l(db);.  rc = sq
1a570 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a  lite3Init(db, &z
1a580 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53  ErrMsg);.  if( S
1a590 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
1a5a0 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1a5b0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  ut;.  }..  /* Lo
1a5c0 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
1a5d0 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20  n question */.  
1a5e0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
1a5f0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62  ndTable(db, zTab
1a600 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29  leName, zDbName)
1a610 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c  ;.  if( !pTab ||
1a620 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
1a630 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a  {.    pTab = 0;.
1a640 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1a650 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ut;.  }..  /* Fi
1a660 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f  nd the column fo
1a670 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20  r which info is 
1a680 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69  requested */.  i
1a690 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d  f( zColumnName==
1a6a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72  0 ){.    /* Quer
1a6b0 79 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20  y for existance 
1a6c0 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f  of table only */
1a6d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
1a6e0 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
1a6f0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
1a700 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d  +){.      pCol =
1a710 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
1a720 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  l];.      if( 0=
1a730 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1a740 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
1a750 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
1a760 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a780 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43  ( iCol==pTab->nC
1a790 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ol ){.      if( 
1a7a0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1a7b0 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  & sqlite3IsRowid
1a7c0 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b  (zColumnName) ){
1a7d0 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  .        iCol = 
1a7e0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
1a7f0 20 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c       pCol = iCol
1a800 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f  >=0 ? &pTab->aCo
1a810 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20  l[iCol] : 0;.   
1a820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a830 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
1a840 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1a850 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1a860 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
1a870 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
1a880 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20  stores the meta 
1a890 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
1a8a0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1a8b0 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61  d.  ** to the ca
1a8c0 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61  ller in local va
1a8d0 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70  riables zDataTyp
1a8e0 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74  e, zCollSeq, not
1a8f0 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79  null, primarykey
1a900 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e  .  ** and autoin
1a910 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  c. At this point
1a920 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1a930 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20  ossibilities:.  
1a940 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20  ** .  **     1. 
1a950 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  The specified co
1a960 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f  lumn name was ro
1a970 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22  wid", "oid" or "
1a980 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20  _rowid_" .  **  
1a990 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20        and there 
1a9a0 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79  is no explicitly
1a9b0 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f   declared IPK co
1a9c0 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  lumn. .  **.  **
1a9d0 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c       2. The tabl
1a9e0 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
1a9f0 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  and the column n
1aa00 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61  ame identified a
1aa10 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65  n .  **        e
1aa20 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
1aa30 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20  ed column. Copy 
1aa40 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
1aa50 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a   from *pCol..  *
1aa60 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b  / .  if( pCol ){
1aa70 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
1aa80 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20   pCol->zType;.  
1aa90 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f    zCollSeq = pCo
1aaa0 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f  l->zColl;.    no
1aab0 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f  tnull = pCol->no
1aac0 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72  tNull!=0;.    pr
1aad0 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f  imarykey  = (pCo
1aae0 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  l->colFlags & CO
1aaf0 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d  LFLAG_PRIMKEY)!=
1ab00 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d  0;.    autoinc =
1ab10 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43   pTab->iPKey==iC
1ab20 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  ol && (pTab->tab
1ab30 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
1ab40 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20  ncrement)!=0;.  
1ab50 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61  }else{.    zData
1ab60 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
1ab70 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
1ab80 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
1ab90 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  !zCollSeq ){.   
1aba0 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69   zCollSeq = sqli
1abb0 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
1abc0 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20  }..error_out:.  
1abd0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1abe0 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
1abf0 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63  Whether the func
1ac00 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65  tion call succee
1ac10 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73  ded or failed, s
1ac20 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  et the output pa
1ac30 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f  rameters.  ** to
1ac40 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20   whatever their 
1ac50 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72  local counterpar
1ac60 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61  ts contain. If a
1ac70 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
1ac80 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73  r,.  ** this has
1ac90 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a   the effect of z
1aca0 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75  eroing all outpu
1acb0 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  t parameters..  
1acc0 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54  */.  if( pzDataT
1acd0 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70  ype ) *pzDataTyp
1ace0 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20  e = zDataType;. 
1acf0 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29   if( pzCollSeq )
1ad00 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43   *pzCollSeq = zC
1ad10 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e  ollSeq;.  if( pN
1ad20 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75  otNull ) *pNotNu
1ad30 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20  ll = notnull;.  
1ad40 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20  if( pPrimaryKey 
1ad50 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d  ) *pPrimaryKey =
1ad60 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
1ad70 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70  f( pAutoinc ) *p
1ad80 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e  Autoinc = autoin
1ad90 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  c;..  if( SQLITE
1ada0 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62  _OK==rc && !pTab
1adb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1adc0 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1add0 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  g);.    zErrMsg 
1ade0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1adf0 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  (db, "no such ta
1ae00 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25  ble column: %s.%
1ae10 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a  s", zTableName,.
1ae20 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e          zColumnN
1ae30 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
1ae40 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1ae50 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57  .  sqlite3ErrorW
1ae60 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28  ithMsg(db, rc, (
1ae70 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c  zErrMsg?"%s":0),
1ae80 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c   zErrMsg);.  sql
1ae90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1aea0 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20  ErrMsg);.  rc = 
1aeb0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
1aec0 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
1aed0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1aee0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1aef0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1af00 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
1af10 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
1af20 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
1af30 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69  time slept..*/.i
1af40 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  nt sqlite3_sleep
1af50 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69  (int ms){.  sqli
1af60 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
1af70 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20   int rc;.  pVfs 
1af80 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
1af90 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66  nd(0);.  if( pVf
1afa0 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
1afb0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
1afc0 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69  tion works in mi
1afd0 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20  lliseconds, but 
1afe0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f  the underlying O
1aff0 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41  sSleep() .  ** A
1b000 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63  PI uses microsec
1b010 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20  onds. Hence the 
1b020 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72  1000's..  */.  r
1b030 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c  c = (sqlite3OsSl
1b040 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d  eep(pVfs, 1000*m
1b050 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  s)/1000);.  retu
1b060 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b070 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
1b080 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  e the extended r
1b090 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a  esult codes..*/.
1b0a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
1b0b0 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
1b0c0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
1b0d0 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65  nt onoff){.#ifde
1b0e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b0f0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1b100 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1b110 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1b120 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1b130 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1b140 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1b150 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1b160 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20    db->errMask = 
1b170 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66  onoff ? 0xffffff
1b180 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c  ff : 0xff;.  sql
1b190 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b1a0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1b1b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
1b1d0 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
1b1e0 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61  l method on a pa
1b1f0 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1b200 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1b210 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73  3_file_control(s
1b220 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1b230 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
1b240 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
1b250 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Arg){.  int rc =
1b260 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1b270 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a   Btree *pBtree;.
1b280 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b290 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1b2a0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1b2b0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1b2c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b2d0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1b2e0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1b2f0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1b300 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d  tex);.  pBtree =
1b310 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
1b320 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
1b330 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  e);.  if( pBtree
1b340 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
1b350 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
1b360 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20  e3_file *fd;.   
1b370 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b380 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1b390 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
1b3a0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65  BtreePager(pBtre
1b3b0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
1b3c0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20  pPager!=0 );.   
1b3d0 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67   fd = sqlite3Pag
1b3e0 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
1b3f0 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d      assert( fd!=
1b400 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  0 );.    if( op=
1b410 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49  =SQLITE_FCNTL_FI
1b420 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  LE_POINTER ){.  
1b430 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69      *(sqlite3_fi
1b440 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a  le**)pArg = fd;.
1b450 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b460 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
1b470 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1b480 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52  CNTL_VFS_POINTER
1b490 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
1b4a0 74 65 33 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d  te3_vfs**)pArg =
1b4b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
1b4c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1b4d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b4e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1b4f0 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a  ==SQLITE_FCNTL_J
1b500 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29  OURNAL_POINTER )
1b510 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
1b520 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
1b530 73 71 6c 69 74 65 33 50 61 67 65 72 4a 72 6e 6c  sqlite3PagerJrnl
1b540 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
1b550 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b560 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
1b570 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
1b580 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1b590 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1b5a0 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
1b5b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b5c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1b5d0 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20  TFOUND;.    }.  
1b5e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b5f0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1b600 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b610 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1b620 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b630 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
1b640 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
1b650 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
1b660 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1b670 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
1b680 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1b690 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1b6a0 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
1b6b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b6c0 54 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20  TER(op);.#else. 
1b6d0 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
1b6e0 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
1b6f0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1b700 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1b710 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
1b720 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
1b730 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  NG..    */.    c
1b740 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1b750 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b  TRL_PRNG_SAVE: {
1b760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
1b770 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20  ngSaveState();. 
1b780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b790 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1b7a0 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61   Restore the sta
1b7b0 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74  te of the PRNG t
1b7c0 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65  o the last state
1b7d0 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20   saved using.   
1b7e0 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20   ** PRNG_SAVE.  
1b7f0 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73  If PRNG_SAVE has
1b800 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1b810 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a  en called, then.
1b820 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62      ** this verb
1b830 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f   acts like PRNG_
1b840 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20  RESET..    */.  
1b850 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1b860 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
1b870 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ORE: {.      sql
1b880 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53  ite3PrngRestoreS
1b890 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
1b8a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1b8b0 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20  /*.    ** Reset 
1b8c0 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f  the PRNG back to
1b8d0 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a   its uninitializ
1b8e0 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e  ed state.  The n
1b8f0 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ext call.    ** 
1b900 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  to sqlite3_rando
1b910 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73  mness() will res
1b920 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69  eed the PRNG usi
1b930 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c  ng a single call
1b940 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  .    ** to the x
1b950 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f  Randomness metho
1b960 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  d of the default
1b970 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   VFS..    */.   
1b980 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1b990 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
1b9a0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1b9b0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30  3_randomness(0,0
1b9c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b9d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1b9e0 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1b9f0 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45  st_control(BITVE
1ba00 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72  C_TEST, size, pr
1ba10 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20  ogram).    **.  
1ba20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20    ** Run a test 
1ba30 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63  against a Bitvec
1ba40 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e   object of size.
1ba50 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72    The program ar
1ba60 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73  gument.    ** is
1ba70 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
1ba80 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e  egers that defin
1ba90 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65  es the test.  Re
1baa0 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20  turn -1 on a.   
1bab0 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
1bac0 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f  ation error, 0 o
1bad0 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f  n success, or no
1bae0 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72  n-zero for an er
1baf0 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  ror..    ** See 
1bb00 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65  the sqlite3Bitve
1bb10 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66  cBuiltinTest() f
1bb20 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1bb30 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
1bb40 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1bb50 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
1bb60 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20  C_TEST: {.      
1bb70 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
1bb80 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1bb90 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f  int *aProg = va_
1bba0 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
1bbb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1bbc0 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
1bbd0 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20  st(sz, aProg);. 
1bbe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bbf0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1bc00 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1bc10 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53  ontrol(FAULT_INS
1bc20 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29  TALL, xCallback)
1bc30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1bc40 72 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65  rrange to invoke
1bc50 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65   xCallback() whe
1bc60 6e 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75  never sqlite3Fau
1bc70 6c 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65  ltSim() is calle
1bc80 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61  d,.    ** if xCa
1bc90 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55  llback is not NU
1bca0 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  LL..    **.    *
1bcb0 2a 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74  * As a test of t
1bcc0 68 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74  he fault simulat
1bcd0 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73  or mechanism its
1bce0 65 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c  elf, sqlite3Faul
1bcf0 74 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69  tSim(0).    ** i
1bd00 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61  s called immedia
1bd10 74 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61  tely after insta
1bd20 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61  lling the new ca
1bd30 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72  llback and the r
1bd40 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c  eturn.    ** val
1bd50 75 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46  ue from sqlite3F
1bd60 61 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d  aultSim(0) becom
1bd70 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  es the return fr
1bd80 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
1bd90 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29  3_test_control()
1bda0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1bdb0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1bdc0 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a  L_FAULT_INSTALL:
1bdd0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43   {.      /* MSVC
1bde0 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20   is picky about 
1bdf0 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72  pulling func ptr
1be00 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e  s from va lists.
1be10 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f  .      ** http:/
1be20 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f  /support.microso
1be30 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a  ft.com/kb/47961.
1be40 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
1be50 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
1be60 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
1be70 61 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69  arg(ap, int(*)(i
1be80 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  nt));.      */. 
1be90 20 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74       typedef int
1bea0 28 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55  (*TESTCALLBACKFU
1beb0 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20  NC_t)(int);.    
1bec0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1bed0 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62  onfig.xTestCallb
1bee0 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ack = va_arg(ap,
1bef0 20 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e   TESTCALLBACKFUN
1bf00 43 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  C_t);.      rc =
1bf10 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1bf20 28 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (0);.      break
1bf30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1bf40 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1bf50 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
1bf60 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
1bf70 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
1bf80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
1bf90 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
1bfa0 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
1bfb0 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
1bfc0 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
1bfd0 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
1bfe0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1bff0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
1c000 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
1c010 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
1c020 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
1c030 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
1c040 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
1c050 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
1c060 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
1c070 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
1c080 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
1c090 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
1c0a0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
1c0b0 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
1c0c0 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
1c0d0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
1c0e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
1c0f0 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
1c100 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
1c110 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
1c120 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c130 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1c140 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1c150 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1c160 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
1c170 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
1c180 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1c190 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1c1a0 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
1c1b0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
1c1c0 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
1c1d0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
1c1e0 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
1c1f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1c200 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
1c210 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
1c220 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
1c230 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1c240 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1c250 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
1c260 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
1c270 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
1c280 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
1c290 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
1c2a0 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
1c2b0 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
1c2c0 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
1c2d0 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
1c2e0 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
1c2f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1c300 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
1c310 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
1c320 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69  .    ** deleteri
1c330 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
1c340 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c350 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
1c360 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
1c370 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47      rc = PENDING
1c380 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53  _BYTE;.#ifndef S
1c390 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
1c3a0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
1c3b0 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56  nsigned int newV
1c3c0 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
1c3d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
1c3e0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61         if( newVa
1c3f0 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69  l ) sqlite3Pendi
1c400 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b  ngByte = newVal;
1c410 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1c420 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c430 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1c440 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1c450 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1c460 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
1c470 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
1c480 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
1c490 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
1c4a0 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
1c4b0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
1c4c0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
1c4d0 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
1c4e0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
1c4f0 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
1c500 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
1c510 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
1c520 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1c530 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
1c540 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
1c550 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
1c560 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
1c570 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1c580 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
1c590 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
1c5a0 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
1c5b0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1c5c0 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
1c5d0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
1c5e0 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
1c5f0 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
1c600 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
1c610 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
1c620 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
1c630 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
1c640 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c650 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1c660 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
1c670 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
1c680 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c690 2f 2a 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f  /*side-effects-o
1c6a0 6b 2a 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28  k*/ (x = va_arg(
1c6b0 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20  ap,int))!=0 );. 
1c6c0 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20       rc = x;.   
1c6d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c6e0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1c6f0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c700 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1c710 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e  TCTRL_ALWAYS, in
1c720 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1c730 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
1c740 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
1c750 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68  me test to see h
1c760 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e  ow the ALWAYS an
1c770 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d  d.    ** NEVER m
1c780 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e  acros were defin
1c790 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1c7a0 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  me..    **.    *
1c7b0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1c7c0 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e  ue is ALWAYS(X).
1c7d0 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
1c7e0 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64   The recommended
1c7f0 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20   test is X==2.  
1c800 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
1c810 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d  lue is 2, that m
1c820 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41  eans.    ** ALWA
1c830 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
1c840 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20   are both no-op 
1c850 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
1c860 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68  ros, which is th
1c870 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
1c880 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68   setting.  If th
1c890 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1c8a0 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53  s 1, then ALWAYS
1c8b0 28 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20  () is either.   
1c8c0 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74   ** hard-coded t
1c8d0 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69  o true or else i
1c8e0 74 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73  t asserts if its
1c8f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
1c900 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  se..    ** The f
1c910 69 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68  irst behavior (h
1c920 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
1c930 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
1c940 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
1c950 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
1c960 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
1c970 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20  t() is disabled 
1c980 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  and the second. 
1c990 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28     ** behavior (
1c9a0 61 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72  assert if the ar
1c9b0 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53  gument to ALWAYS
1c9c0 28 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20  () is false) is 
1c9d0 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
1c9e0 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
1c9f0 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
1ca00 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
1ca10 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a   enabled..    **
1ca20 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d  .    ** The run-
1ca30 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64  time test proced
1ca40 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73  ure might look s
1ca50 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
1ca60 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
1ca70 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  *    if( sqlite3
1ca80 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1ca90 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1caa0 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20  WAYS, 2)==2 ){. 
1cab0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1cac0 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
1cad0 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73  () are no-op pas
1cae0 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
1caf0 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
1cb00 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
1cb10 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1cb20 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1cb30 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20  , 1) ){.    **  
1cb40 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29      // ALWAYS(x)
1cb50 20 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20   asserts that x 
1cb60 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78  is true. NEVER(x
1cb70 29 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66  ) asserts x is f
1cb80 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20  alse..    **    
1cb90 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20  }else{.    **   
1cba0 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
1cbb0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e  is a constant 1.
1cbc0 20 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20    NEVER(x) is a 
1cbd0 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20  constant 0..    
1cbe0 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20  **    }.    */. 
1cbf0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1cc00 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20  ESTCTRL_ALWAYS: 
1cc10 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
1cc20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1cc30 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59        rc = ALWAY
1cc40 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  S(x);.      brea
1cc50 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1cc60 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  .    **   sqlite
1cc70 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1cc80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1cc90 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a  YTEORDER);.    *
1cca0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74  *.    ** The int
1ccb0 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65  eger returned re
1ccc0 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f  veals the byte-o
1ccd0 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70  rder of the comp
1cce0 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20  uter on which.  
1ccf0 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72    ** SQLite is r
1cd00 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20  unning:.    **. 
1cd10 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20     **       1   
1cd20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
1cd30 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1cd40 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1cd50 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c      10     littl
1cd60 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
1cd70 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  ined at run-time
1cd80 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20  .    **  432101 
1cd90 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1cda0 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1cdb0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1cdc0 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20    **  123410    
1cdd0 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
1cde0 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
1cdf0 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
1ce00 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  / .    case SQLI
1ce10 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
1ce20 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ORDER: {.      r
1ce30 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  c = SQLITE_BYTEO
1ce40 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54  RDER*100 + SQLIT
1ce50 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31  E_LITTLEENDIAN*1
1ce60 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e  0 + SQLITE_BIGEN
1ce70 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61  DIAN;.      brea
1ce80 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1ce90 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1cea0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1ceb0 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
1cec0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1ced0 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1cee0 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65  ** Set the nRese
1cef0 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f  rve size to N fo
1cf00 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
1cf10 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ase on the datab
1cf20 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65  ase.    ** conne
1cf30 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f  ction db..    */
1cf40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1cf50 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1cf60 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1cf70 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1cf80 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1cf90 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1cfa0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1cfb0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1cfc0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1cfd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cfe0 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
1cff0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
1d000 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20   0, x, 0);.     
1d010 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d020 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1d030 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d040 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1d050 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1d060 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1d070 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
1d080 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1d090 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1d0a0 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1d0b0 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74  able various opt
1d0c0 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74  imizations for t
1d0d0 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
1d0e0 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72    The .    ** ar
1d0f0 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69  gument N is a bi
1d100 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
1d110 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ations to be dis
1d120 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d  abled.  For norm
1d130 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  al.    ** operat
1d140 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20  ion N should be 
1d150 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20  0.  The idea is 
1d160 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67  that a test prog
1d170 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20  ram (like the.  
1d180 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54    ** SQL Logic T
1d190 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20  est or SLT test 
1d1a0 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20  module) can run 
1d1b0 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c  the same SQL mul
1d1c0 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20  tiple times.    
1d1d0 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20  ** with various 
1d1e0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69  optimizations di
1d1f0 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79  sabled to verify
1d200 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
1d210 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  nswer.    ** is 
1d220 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72  obtained in ever
1d230 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  y case..    */. 
1d240 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1d250 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
1d260 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73  TIONS: {.      s
1d270 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1d280 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1d290 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f  );.      db->dbO
1d2a0 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28  ptFlags = (u16)(
1d2b0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20  va_arg(ap, int) 
1d2c0 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20  & 0xffff);.     
1d2d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
1d2e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b  ifdef SQLITE_N_K
1d2f0 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71  EYWORD.    /* sq
1d300 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d310 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d320 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f  RL_ISKEYWORD, co
1d330 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29  nst char *zWord)
1d340 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1d350 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79  f zWord is a key
1d360 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20  word recognized 
1d370 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  by the parser, t
1d380 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20  hen return the. 
1d390 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
1d3a0 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66  keywords.  Or if
1d3b0 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20   zWord is not a 
1d3c0 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20  keyword, return 
1d3d0 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  0..    ** .    *
1d3e0 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74  * This test feat
1d3f0 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ure is only avai
1d400 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61  lable in the ama
1d410 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a  lgamation since.
1d420 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54      ** the SQLIT
1d430 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72  E_N_KEYWORD macr
1d440 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  o is not defined
1d450 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66   in this file if
1d460 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69   SQLite.    ** i
1d470 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65  s built using se
1d480 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69  parate source fi
1d490 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1d4a0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1d4b0 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20  CTRL_ISKEYWORD: 
1d4c0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1d4d0 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61  ar *zWord = va_a
1d4e0 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
1d4f0 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r*);.      int n
1d500 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1d510 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20  30(zWord);.     
1d520 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65   rc = (sqlite3Ke
1d530 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a  ywordCode((u8*)z
1d540 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29  Word, n)!=TK_ID)
1d550 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57   ? SQLITE_N_KEYW
1d560 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62  ORD : 0;.      b
1d570 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1d580 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69  if ..    /* sqli
1d590 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1d5a0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1d5b0 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20  _SCRATCHMALLOC, 
1d5c0 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65  sz, &pNew, pFree
1d5d0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1d5e0 20 50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f   Pass pFree into
1d5f0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
1d600 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49  ree(). .    ** I
1d610 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f  f sz>0 then allo
1d620 63 61 74 65 20 61 20 73 63 72 61 74 63 68 20 62  cate a scratch b
1d630 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e  uffer into pNew.
1d640 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61    .    */.    ca
1d650 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1d660 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43  RL_SCRATCHMALLOC
1d670 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  : {.      void *
1d680 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a  pFree, **ppNew;.
1d690 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20        int sz;.  
1d6a0 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28      sz = va_arg(
1d6b0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1d6c0 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61  ppNew = va_arg(a
1d6d0 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20  p, void**);.    
1d6e0 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67    pFree = va_arg
1d6f0 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
1d700 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e     if( sz ) *ppN
1d710 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ew = sqlite3Scra
1d720 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20  tchMalloc(sz);. 
1d730 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 72 61       sqlite3Scra
1d740 74 63 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a  tchFree(pFree);.
1d750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d760 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1d770 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1d780 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1d790 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
1d7a0 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20  T, int onoff);. 
1d7b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1d7c0 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20  parameter onoff 
1d7d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e  is non-zero, con
1d7e0 66 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70  figure the wrapp
1d7f0 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a  ers so that all.
1d800 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e      ** subsequen
1d810 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c  t calls to local
1d820 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61  time() and varia
1d830 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f  nts fail. If ono
1d840 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20  ff is zero,.    
1d850 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74  ** undo this set
1d860 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ting..    */.   
1d870 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1d880 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
1d890 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73  FAULT: {.      s
1d8a0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1d8b0 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75  ig.bLocaltimeFau
1d8c0 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  lt = va_arg(ap, 
1d8d0 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1d8e0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d8f0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1d900 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d910 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
1d920 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20  RRUPT, int);.   
1d930 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f   **.    ** Set o
1d940 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74  r clear a flag t
1d950 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68  hat indicates th
1d960 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1d970 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77  file is always w
1d980 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d  ell-.    ** form
1d990 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72  ed and never cor
1d9a0 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67  rupt.  This flag
1d9b0 20 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66   is clear by def
1d9c0 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67  ault, indicating
1d9d0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74   that.    ** dat
1d9e0 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68  abase files migh
1d9f0 74 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79  t have arbitrary
1da00 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65   corruption.  Se
1da10 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64  tting the flag d
1da20 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73  uring.    ** tes
1da30 74 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74  ting causes cert
1da40 61 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  ain assert() sta
1da50 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
1da60 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61  ode to be activa
1da70 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ted.    ** that 
1da80 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72  demonstrat invar
1da90 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f  iants on well-fo
1daa0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
1dab0 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1dac0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1dad0 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
1dae0 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  PT: {.      sqli
1daf0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1db00 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76  neverCorrupt = v
1db10 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1db20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1db30 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71   }...    /*   sq
1db40 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1db50 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1db60 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  RL_VDBE_COVERAGE
1db70 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72  , xCallback, ptr
1db80 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1db90 20 53 65 74 20 74 68 65 20 56 44 42 45 20 63 6f   Set the VDBE co
1dba0 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20  verage callback 
1dbb0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c  function to xCal
1dbc0 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65  lback with conte
1dbd0 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  xt .    ** point
1dbe0 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20  er ptr..    */. 
1dbf0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1dc00 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56  ESTCTRL_VDBE_COV
1dc10 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20  ERAGE: {.#ifdef 
1dc20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
1dc30 52 41 47 45 0a 20 20 20 20 20 20 74 79 70 65 64  RAGE.      typed
1dc40 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68  ef void (*branch
1dc50 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  _callback)(void*
1dc60 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20 20  ,int,u8,u8);.   
1dc70 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1dc80 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61 6e  Config.xVdbeBran
1dc90 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 62  ch = va_arg(ap,b
1dca0 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b  ranch_callback);
1dcb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1dcc0 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65  obalConfig.pVdbe
1dcd0 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f 61  BranchArg = va_a
1dce0 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65  rg(ap,void*);.#e
1dcf0 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
1dd00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1dd10 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1dd20 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1dd30 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d  STCTRL_SORTER_MM
1dd40 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20 2a  AP, db, nMax); *
1dd50 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1dd60 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
1dd70 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20  R_MMAP: {.      
1dd80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
1dd90 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
1dda0 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 4d  *);.      db->nM
1ddb0 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 76  axSorterMmap = v
1ddc0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1ddd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dde0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1ddf0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1de00 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1de10 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20 20 2a  L_ISINIT);.    *
1de20 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  *.    ** Return 
1de30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51 4c  SQLITE_OK if SQL
1de40 69 74 65 20 68 61 73 20 62 65 65 6e 20 69 6e 69  ite has been ini
1de50 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53 51 4c  tialized and SQL
1de60 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20 20 20  ITE_ERROR if.   
1de70 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a   ** not..    */.
1de80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1de90 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 3a  TESTCTRL_ISINIT:
1dea0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
1deb0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1dec0 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72 63 20  .isInit==0 ) rc 
1ded0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1dee0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1def0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69   }..    /*  sqli
1df00 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1df10 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1df20 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 64  _IMPOSTER, db, d
1df30 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e  bName, onOff, tn
1df40 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  um);.    **.    
1df50 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e  ** This test con
1df60 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74 6f 20  trol is used to 
1df70 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20  create imposter 
1df80 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20 69 73  tables.  "db" is
1df90 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a   a pointer.    *
1dfa0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1dfb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 64  e connection.  d
1dfc0 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64 61 74  bName is the dat
1dfd0 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78 3a 20  abase name (ex: 
1dfe0 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a 2a  "main" or.    **
1dff0 20 22 74 65 6d 70 22 29 20 77 68 69 63 68 20 77   "temp") which w
1e000 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68 65 20  ill receive the 
1e010 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f 66  imposter.  "onOf
1e020 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73 74 65  f" turns imposte
1e030 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a 2a  r mode on.    **
1e040 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d 22   or off.  "tnum"
1e050 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
1e060 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
1e070 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6d 70  to which the imp
1e080 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62  oster.    ** tab
1e090 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65 63  le should connec
1e0a0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
1e0b0 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65 72   Enable imposter
1e0c0 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e 20   mode only when 
1e0d0 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 61  the schema has a
1e0e0 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61 72 73  lready been pars
1e0f0 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a  ed.  Then.    **
1e100 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 43 52   run a single CR
1e110 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1e120 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75 63  ment to construc
1e130 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  t the imposter t
1e140 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20 74  able in.    ** t
1e150 68 65 20 70 61 72 73 65 64 20 73 63 68 65 6d 61  he parsed schema
1e160 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69 6d 70  .  Then turn imp
1e170 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63 6b 20  oster mode back 
1e180 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20 20 2a  off again..    *
1e190 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f 66  *.    ** If onOf
1e1a0 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30 20  f==0 and tnum>0 
1e1b0 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 73  then reset the s
1e1c0 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64 61  chema for all da
1e1d0 74 61 62 61 73 65 73 2c 20 63 61 75 73 69 6e 67  tabases, causing
1e1e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65  .    ** the sche
1e1f0 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72 73 65  ma to be reparse
1e200 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
1e210 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20 20 54  it is needed.  T
1e220 68 69 73 20 68 61 73 20 74 68 65 0a 20 20 20 20  his has the.    
1e230 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65 72 61  ** effect of era
1e240 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74 65  sing all imposte
1e250 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f  r tables..    */
1e260 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e270 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
1e280 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
1e290 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1e2a0 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1e2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1e2c0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1e2d0 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  tex);.      db->
1e2e0 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c 69 74  init.iDb = sqlit
1e2f0 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
1e300 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73 74   va_arg(ap,const
1e310 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20   char*));.      
1e320 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20  db->init.busy = 
1e330 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
1e340 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72 67 28  rTable = va_arg(
1e350 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64  ap,int);.      d
1e360 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
1e370 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1e380 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
1e390 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26 20  init.busy==0 && 
1e3a0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1e3b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
1e3c0 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
1e3d0 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
1e3e0 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
1e3f0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1e400 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1e410 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
1e420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1e430 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20  end(ap);.#endif 
1e440 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
1e450 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20  UILTIN_TEST */. 
1e460 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e470 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
1e480 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20  tility routine, 
1e490 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d  useful to VFS im
1e4a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74  plementations, t
1e4b0 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f  hat checks.** to
1e4c0 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61   see if a databa
1e4d0 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52  se file was a UR
1e4e0 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64  I that contained
1e4f0 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72   a specific quer
1e500 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c  y .** parameter,
1e510 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69   and if so obtai
1e520 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1e530 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  the query parame
1e540 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  ter..**.** The z
1e550 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
1e560 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d  t is the filenam
1e570 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64  e pointer passed
1e580 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28   into the xOpen(
1e590 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61  ).** method of a
1e5a0 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1e5b0 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d  ion.  The zParam
1e5c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1e5d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
1e5e0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
1e5f0 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72  we seek.  This r
1e600 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1e610 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1e620 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65  zParam.** parame
1e630 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73  ter if it exists
1e640 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  .  If the parame
1e650 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ter does not exi
1e660 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
1e670 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55  .** returns a NU
1e680 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63  LL pointer..*/.c
1e690 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1e6a0 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
1e6b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1e6c0 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
1e6d0 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69  ar *zParam){.  i
1e6e0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
1e6f0 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72  || zParam==0 ) r
1e700 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65  eturn 0;.  zFile
1e710 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1e720 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1e730 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  e) + 1;.  while(
1e740 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
1e750 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72  .    int x = str
1e760 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  cmp(zFilename, z
1e770 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c  Param);.    zFil
1e780 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
1e790 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
1e7a0 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  me) + 1;.    if(
1e7b0 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a   x==0 ) return z
1e7c0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46  Filename;.    zF
1e7d0 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1e7e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1e7f0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20  name) + 1;.  }. 
1e800 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1e810 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f  .** Return a boo
1e820 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  lean value for a
1e830 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1e840 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e850 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e  _uri_boolean(con
1e860 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1e870 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1e880 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c  zParam, int bDfl
1e890 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
1e8a0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1e8b0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1e8c0 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1e8d0 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21    bDflt = bDflt!
1e8e0 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f  =0;.  return z ?
1e8f0 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
1e900 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62  an(z, bDflt) : b
1e910 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
1e920 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69  eturn a 64-bit i
1e930 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
1e940 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74   a query paramet
1e950 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  er..*/.sqlite3_i
1e960 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69  nt64 sqlite3_uri
1e970 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20  _int64(.  const 
1e980 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1e990 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
1e9a0 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70  as passed to xOp
1e9b0 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  en */.  const ch
1e9c0 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20  ar *zParam,     
1e9d0 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74    /* URI paramet
1e9e0 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73  er sought */.  s
1e9f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66  qlite3_int64 bDf
1ea00 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  lt       /* retu
1ea10 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20  rn if parameter 
1ea20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b  is missing */.){
1ea30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ea40 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1ea50 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1ea60 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73  me, zParam);.  s
1ea70 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a  qlite3_int64 v;.
1ea80 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74    if( z && sqlit
1ea90 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
1eaa0 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f 4f  z, &v)==SQLITE_O
1eab0 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d  K ){.    bDflt =
1eac0 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   v;.  }.  return
1ead0 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   bDflt;.}../*.**
1eae0 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72 65   Return the Btre
1eaf0 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69  e pointer identi
1eb00 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e  fied by zDbName.
1eb10 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1eb20 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42   not found..*/.B
1eb30 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e  tree *sqlite3DbN
1eb40 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74  ameToBtree(sqlit
1eb50 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
1eb60 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
1eb70 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1eb80 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1eb90 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
1eba0 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26  Db[i].pBt.     &
1ebb0 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c  & (zDbName==0 ||
1ebc0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1ebd0 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  zDbName, db->aDb
1ebe0 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20  [i].zName)==0). 
1ebf0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1ec00 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  rn db->aDb[i].pB
1ec10 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
1ec20 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1ec30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
1ec40 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  ename of the dat
1ec50 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
1ec60 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
1ec70 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
1ec80 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1ec90 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
1eca0 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
1ecb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1ecc0 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  ame){.  Btree *p
1ecd0 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Bt;.#ifdef SQLIT
1ece0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1ecf0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1ed00 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1ed10 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
1ed20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1ed30 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
1ed40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
1ed50 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  Bt = sqlite3DbNa
1ed60 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1ed70 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  bName);.  return
1ed80 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74   pBt ? sqlite3Bt
1ed90 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70  reeGetFilename(p
1eda0 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Bt) : 0;.}../*.*
1edb0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64 61  * Return 1 if da
1edc0 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f  tabase is read-o
1edd0 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61 64  nly or 0 if read
1ede0 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20  /write.  Return 
1edf0 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  -1 if.** no such
1ee00 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73   database exists
1ee10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ee20 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c  _db_readonly(sql
1ee30 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1ee40 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1ee50 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
1ee60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ee70 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1ee80 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1ee90 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1eea0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1eeb0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1eec0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
1eed0 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20  .#endif.  pBt = 
1eee0 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1eef0 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1ef00 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
1ef10 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ? sqlite3BtreeIs
1ef20 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20  Readonly(pBt) : 
1ef30 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  -1;.}..#ifdef SQ
1ef40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
1ef50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  SHOT./*.** Obtai
1ef60 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e  n a snapshot han
1ef70 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61 70  dle for the snap
1ef80 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73 65  shot of database
1ef90 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20 0a   zDb currently .
1efa0 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62 79  ** being read by
1efb0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
1efc0 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  nt sqlite3_snaps
1efd0 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69 74  hot_get(.  sqlit
1efe0 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
1eff0 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71   char *zDb,.  sq
1f000 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
1f010 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20  *ppSnapshot.){. 
1f020 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f030 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20  _ERROR;.#ifndef 
1f040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1f050 20 20 69 6e 74 20 69 44 62 3b 0a 0a 23 69 66 64    int iDb;..#ifd
1f060 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1f070 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1f080 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1f090 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
1f0a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f0b0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
1f0c0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1f0d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1f0e0 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 44 62  ->mutex);..  iDb
1f0f0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
1f100 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
1f110 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
1f120 44 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65  Db>1 ){.    Btre
1f130 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
1f140 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
1f150 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
1f160 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
1f170 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f180 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1f190 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20  Trans(pBt, 0);. 
1f1a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f1b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f1c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f1d0 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28 73  gerSnapshotGet(s
1f1e0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1f1f0 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68 6f  (pBt), ppSnapsho
1f200 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1f210 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
1f220 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1f230 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
1f240 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
1f250 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
1f260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
1f270 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
1f280 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e 61  ction on the sna
1f290 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65 64  pshot idendified
1f2a0 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a 2a   by pSnapshot..*
1f2b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
1f2c0 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 73  apshot_open(.  s
1f2d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
1f2e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
1f2f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
1f300 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a 29  hot *pSnapshot.)
1f310 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f320 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64  ITE_ERROR;.#ifnd
1f330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1f340 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  AL..#ifdef SQLIT
1f350 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1f360 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1f370 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1f380 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
1f390 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1f3a0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
1f3b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f3c0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1f3d0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  ;.  if( db->auto
1f3e0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f3f0 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69 44   int iDb;.    iD
1f400 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
1f410 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
1f420 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c      if( iDb==0 |
1f430 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20  | iDb>1 ){.     
1f440 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
1f450 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
1f460 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
1f470 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
1f480 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  dTrans(pBt) ){. 
1f490 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f4a0 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
1f4b0 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65  Open(sqlite3Btre
1f4c0 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 53 6e  ePager(pBt), pSn
1f4d0 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20  apshot);.       
1f4e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f4f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f500 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f510 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
1f520 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
1f530 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
1f540 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42  hotOpen(sqlite3B
1f550 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
1f560 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
1f570 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f580 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f590 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1f5a0 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
1f5b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
1f5c0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1f5d0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
1f5e0 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f  napshot handle o
1f5f0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1f600 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
1f610 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  t()..*/.void sql
1f620 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
1f630 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  ee(sqlite3_snaps
1f640 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b  hot *pSnapshot){
1f650 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1f660 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65  pSnapshot);.}.#e
1f670 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1f680 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
1f690 2f 0a                                            /.