/ Hex Artifact Content
Login

Artifact e5675877b35bd894e5803588974fc59369d5a6f2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
1b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1b10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1b30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1b40: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b60: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1b70: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1b80: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1b90: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1ba0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1bb0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1bc0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1bd0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1be0: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1bf0: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1c00: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1c10: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1c20: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1c30: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1c40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c60: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1c70: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1c80: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1c90: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1ca0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1cb0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1cc0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1cd0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1ce0: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1cf0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1d00: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1d10: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1d20: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1d30: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1d40: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1d50: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1d60: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1d70: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1d80: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1d90: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1da0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1db0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1dc0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1dd0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1de0: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1df0: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1e00: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1e10: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1e20: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1e30: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1e40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1e50: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1e60: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1e70: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1e80: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1e90: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1ea0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1eb0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1ec0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1ed0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1ee0: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1ef0: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1f00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f10: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1f20: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1f30: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1f40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f50: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f70: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1f90: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1fa0: 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  ess = 1;.#ifdef 
1fb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
1fc0: 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20 20 20  LLOG.    {.     
1fd0: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
1fe0: 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67  ite3_init_sqllog
1ff0: 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 73 71  (void);.      sq
2000: 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f  lite3_init_sqllo
2010: 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  g();.    }.#endi
2020: 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71  f.    memset(&sq
2030: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
2040: 74 69 6f 6e 73 2c 20 30 2c 20 73 69 7a 65 6f 66  tions, 0, sizeof
2050: 28 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46  (sqlite3BuiltinF
2060: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
2070: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
2080: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
2090: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
20a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
20b0: 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29  sPCacheInit==0 )
20c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20d0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
20e0: 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20  lize();.    }.  
20f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2110: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2120: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2130: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
2140: 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20  lite3OsInit();. 
2150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2160: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2170: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
2180: 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71  eBufferSetup( sq
2190: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
21a0: 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20  g.pPage, .      
21b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
21c0: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20  lConfig.szPage, 
21d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
21e0: 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20  fig.nPage);.    
21f0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2200: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31  onfig.isInit = 1
2210: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2220: 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20 20  EXTRA_INIT.     
2230: 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d   bRunExtraInit =
2240: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
2250: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2260: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
2270: 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ess = 0;.  }.  s
2280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2290: 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ve(sqlite3Global
22a0: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
22b0: 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63  x);..  /* Go bac
22c0: 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74  k under the stat
22d0: 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65  ic mutex and cle
22e0: 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73  an up the recurs
22f0: 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74  ive.  ** mutex t
2300: 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f  o prevent a reso
2310: 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a  urce leak..  */.
2320: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2330: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
2340: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2350: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2360: 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c  tex--;.  if( sql
2370: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2380: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d  .nRefInitMutex<=
2390: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
23a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
23b0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
23c0: 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
23d0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
23e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
23f0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
2400: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2410: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
2420: 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tex = 0;.  }.  s
2430: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2440: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
2450: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2460: 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74   is just a sanit
2470: 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  y check to make 
2480: 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a  sure SQLite has.
2490: 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c    ** been compil
24a0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  ed correctly.  I
24b0: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
24c0: 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c  o run this code,
24d0: 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   but.  ** we don
24e0: 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69  't want to run i
24f0: 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20  t too often and 
2500: 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c  soak up CPU cycl
2510: 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72  es for no.  ** r
2520: 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75  eason.  So we ru
2530: 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67  n it once during
2540: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
2550: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
2560: 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c  EBUG.#ifndef SQL
2570: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
2580: 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69  G_POINT.  /* Thi
2590: 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64  s section of cod
25a0: 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74  e's only "output
25b0: 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28  " is via assert(
25c0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f  ) statements. */
25d0: 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49  .  if ( rc==SQLI
25e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34  TE_OK ){.    u64
25f0: 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c   x = (((u64)1)<<
2600: 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c  63)-1;.    doubl
2610: 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e y;.    assert(
2620: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20  sizeof(x)==8);. 
2630: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
2640: 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b  (x)==sizeof(y));
2650: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20  .    memcpy(&y, 
2660: 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65  &x, 8);.    asse
2670: 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  rt( sqlite3IsNaN
2680: 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (y) );.  }.#endi
2690: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  f.#endif..  /* D
26a0: 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  o extra initiali
26b0: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71  zation steps req
26c0: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51  uested by the SQ
26d0: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
26e0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
26f0: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  e option..  */.#
2700: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2710: 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52  RA_INIT.  if( bR
2720: 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20  unExtraInit ){. 
2730: 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58     int SQLITE_EX
2740: 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63  TRA_INIT(const c
2750: 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  har*);.    rc = 
2760: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2770: 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  T(0);.  }.#endif
2780: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2790: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65  ../*.** Undo the
27a0: 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69   effects of sqli
27b0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
27c0: 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63  .  Must not be c
27d0: 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74  alled while.** t
27e0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
27f0: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ding database co
2800: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
2810: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
2820: 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20  or.** while any 
2830: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69  part of SQLite i
2840: 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  s otherwise in u
2850: 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64  se in any thread
2860: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2870: 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  ne is not thread
2880: 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73  safe.  But it is
2890: 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20   safe to invoke 
28a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
28b0: 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  on when SQLite i
28c0: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
28d0: 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20  own.  If SQLite 
28e0: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
28f0: 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  down.** when thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
2910: 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  oked, then this 
2920: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2930: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2940: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
2950: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64  down(void){.#ifd
2960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2970: 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  SD.  int rc = sq
2980: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
2990: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
29a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
29c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
29d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
29e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a  onfig.isInit ){.
29f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2a00: 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20  TRA_SHUTDOWN.   
2a10: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54   void SQLITE_EXT
2a20: 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64  RA_SHUTDOWN(void
2a30: 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58  );.    SQLITE_EX
2a40: 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a  TRA_SHUTDOWN();.
2a50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2a60: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
2a70: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
2a80: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
2a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2aa0: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2ab0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2ac0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ad0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2ae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2af0: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2b00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b10: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2b20: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2b30: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2b40: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b50: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2b60: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
2b70: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b80: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b90: 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  Init = 0;..#ifnd
2ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2bb0: 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52  HUTDOWN_DIRECTOR
2bc0: 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68  IES.    /* The h
2bd0: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61  eap subsystem ha
2be0: 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64  s now been shutd
2bf0: 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61  own and these va
2c00: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2c10: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e  d.    ** to be N
2c20: 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20  ULL or point to 
2c30: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2c40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2c50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a  lite3_malloc(),.
2c60: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2c70: 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20  ld rely on that 
2c80: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20  heap subsystem; 
2c90: 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20  therefore, make 
2ca0: 73 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a  sure these.    *
2cb0: 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20  * values cannot 
2cc0: 72 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65  refer to heap me
2cd0: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75  mory that was ju
2ce0: 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  st invalidated w
2cf0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68  hen the.    ** h
2d00: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61  eap subsystem wa
2d10: 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  s shutdown.  Thi
2d20: 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69  s is only done i
2d30: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  f the current ca
2d40: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ll to.    ** thi
2d50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  s function resul
2d60: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20  ted in the heap 
2d70: 73 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c  subsystem actual
2d80: 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77  ly being shutdow
2d90: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  n..    */.    sq
2da0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2db0: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tory = 0;.    sq
2dc0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2dd0: 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tory = 0;.#endif
2de0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2e00: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2e10: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2e20: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2e30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2e40: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
2e50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2e60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e70: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
2e80: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
2e90: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
2ea0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
2eb0: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
2ec0: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
2ed0: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
2ee0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2ef0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
2f00: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2f10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
2f20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2f30: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2f40: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
2f50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2f60: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
2f70: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
2f80: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
2f90: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
2fa0: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
2fb0: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
2fc0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
2fd0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
2fe0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
2ff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
3000: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
3010: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
3020: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
3030: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
3040: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
3050: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
3060: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
3070: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3080: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
3090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
30a0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
30b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
30c0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
30d0: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
30e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
30f0: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
3100: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
3110: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
3120: 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23  ompile..    */.#
3130: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3140: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3150: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3160: 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  FE>0  /* IMP: R-
3170: 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20  54466-46756 */. 
3180: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3190: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
31a0: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AD: {.      /* E
31b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
31c0: 37 34 38 2d 31 39 30 39 36 20 54 68 69 73 20 6f  748-19096 This o
31d0: 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74  ption sets the t
31e0: 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f  hreading mode to
31f0: 0a 20 20 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65  .      ** Single
3200: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
3210: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3220: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3230: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3240: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
3250: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3260: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3270: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3280: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3290: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
32a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
32c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
32d0: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
32e0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
32f0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32 30   /* IMP: R-20520
3300: 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63 61  -54086 */.    ca
3310: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3320: 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a  _MULTITHREAD: {.
3330: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3340: 45 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d 34 32  E-OF: R-14374-42
3350: 34 36 38 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  468 This option 
3360: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3370: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3380: 20 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64   ** Multi-thread
3390: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
33a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33b0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20  CoreMutex = 1;  
33c0: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
33d0: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
33e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
33f0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
3400: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
3410: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
3420: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
3430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3440: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3450: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3460: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3470: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3480: 20 52 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a   R-59593-21810 *
3490: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
34a0: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
34b0: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
34c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
34d0: 31 32 32 30 2d 35 31 38 30 30 20 54 68 69 73 20  1220-51800 This 
34e0: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
34f0: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
3500: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 65 72 69 61  o.      ** Seria
3510: 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lized. */.      
3520: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3530: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
3540: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
3550: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3570: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
3580: 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e  utex = 1;  /* En
3590: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
35a0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
35b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
35c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
35d0: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
35e0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
35f0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3600: 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34 38 37  IMP: R-63666-487
3610: 35 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  55 */.    case S
3620: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
3630: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EX: {.      /* S
3640: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
3650: 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c  ative mutex impl
3660: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3670: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3680: 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20  lConfig.mutex = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
36b0: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
36c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
36d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
36e0: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
36f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3700: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  FE>0 /* IMP: R-1
3710: 34 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20  4450-37597 */.  
3720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3730: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
3740: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
3750: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
3760: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
3770: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
3780: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3790: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
37a0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
37b0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20  Config.mutex;.  
37c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
37e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
37f0: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
3800: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3810: 52 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68  R-55594-21030 Th
3820: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3830: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3840: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3850: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3860: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3870: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3880: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3890: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
38a0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
38b0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65  The argument spe
38c0: 63 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69  cifies alternati
38d0: 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d  ve.      ** low-
38e0: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
38f0: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3900: 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70   to be used in p
3910: 6c 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  lace of the memo
3920: 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ry.      ** allo
3930: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3940: 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74  built into SQLit
3950: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
3960: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3970: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3980: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3990: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
39a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
39b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
39c0: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
39d0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
39e0: 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31  OF: R-51213-4641
39f0: 34 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  4 The SQLITE_CON
3a00: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70  FIG_GETMALLOC op
3a10: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3a20: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3a30: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
3a40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3a50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
3a60: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
3a70: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3a80: 63 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74  cture. The sqlit
3a90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3aa0: 74 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20  tructure is.    
3ab0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
3ad0: 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c  efined memory al
3ae0: 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  location routine
3af0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  s. */.      if( 
3b00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3b10: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30  fig.m.xMalloc==0
3b20: 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74   ) sqlite3MemSet
3b30: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3b40: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3b50: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3b60: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3b70: 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20  alConfig.m;.    
3b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ba0: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
3bb0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3bc0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35  ENCE-OF: R-61275
3bd0: 2d 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54  -35157 The SQLIT
3be0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
3bf0: 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a  US option takes.
3c00: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3c10: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65  argument of type
3c20: 20 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65   int, interprete
3c30: 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20  d as a boolean, 
3c40: 77 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20  which enables.  
3c50: 20 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c      ** or disabl
3c60: 65 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f  es the collectio
3c70: 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  n of memory allo
3c80: 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  cation statistic
3c90: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
3ca0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3cb0: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
3cc0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ce0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3cf0: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b  ONFIG_SCRATCH: {
3d00: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3d10: 43 45 2d 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36  CE-OF: R-08404-6
3d20: 30 38 38 37 20 54 68 65 72 65 20 61 72 65 20 74  0887 There are t
3d30: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
3d40: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
3d50: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
3d60: 3a 20 41 20 70 6f 69 6e 74 65 72 20 61 6e 20 38  : A pointer an 8
3d70: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3d80: 6d 6f 72 79 20 62 75 66 66 65 72 20 66 72 6f 6d  mory buffer from
3d90: 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20  .      ** which 
3da0: 74 68 65 20 73 63 72 61 74 63 68 20 61 6c 6c 6f  the scratch allo
3db0: 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  cations will be 
3dc0: 64 72 61 77 6e 2c 20 74 68 65 20 73 69 7a 65 20  drawn, the size 
3dd0: 6f 66 20 65 61 63 68 20 73 63 72 61 74 63 68 0a  of each scratch.
3de0: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3df0: 69 6f 6e 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ion (sz), and th
3e00: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
3e10: 20 6f 66 20 73 63 72 61 74 63 68 20 61 6c 6c 6f   of scratch allo
3e20: 63 61 74 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a  cations (N). */.
3e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3e40: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
3e50: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
3e60: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3e70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3e80: 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61  g.szScratch = va
3e90: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3eb0: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
3ec0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3ed0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3ef0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3f00: 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  AGECACHE: {.    
3f10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3f20: 3a 20 52 2d 31 38 37 36 31 2d 33 36 36 30 31 20  : R-18761-36601 
3f30: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
3f40: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
3f50: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
3f60: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 41  FIG_PAGECACHE: A
3f70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 38 2d 62 79   pointer to 8-by
3f80: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3f90: 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20  y (pMem),.      
3fa0: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65  ** the size of e
3fb0: 61 63 68 20 70 61 67 65 20 63 61 63 68 65 20 6c  ach page cache l
3fc0: 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ine (sz), and th
3fd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
3fe0: 65 20 6c 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  e lines.      **
3ff0: 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73   (N). */.      s
4000: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4010: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
4020: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
4030: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4040: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
4050: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
4080: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4090: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
40a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
40c0: 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20  CACHE_HDRSZ: {. 
40d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
40e0: 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32 37 33  -OF: R-39100-273
40f0: 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  17 The SQLITE_CO
4100: 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53  NFIG_PCACHE_HDRS
4110: 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  Z option takes. 
4120: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
4130: 20 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68   parameter which
4140: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4150: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
4160: 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20 20 20  writes into.    
4170: 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65    ** that intege
4180: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
4190: 65 78 74 72 61 20 62 79 74 65 73 20 70 65 72 20  extra bytes per 
41a0: 70 61 67 65 20 72 65 71 75 69 72 65 64 20 66 6f  page required fo
41b0: 72 20 65 61 63 68 20 70 61 67 65 0a 20 20 20 20  r each page.    
41c0: 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43    ** in SQLITE_C
41d0: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e  ONFIG_PAGECACHE.
41e0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
41f0: 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20  g(ap, int*) = . 
4200: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4210: 48 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28  HeaderSizeBtree(
4220: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
4230: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4240: 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20 20 20  cache() +.      
4250: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4260: 72 53 69 7a 65 50 63 61 63 68 65 31 28 29 3b 0a  rSizePcache1();.
4270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4280: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4290: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
42a0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
42b0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
42d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
42e0: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
42f0: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
4300: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
4310: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
4320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4330: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4340: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
4350: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  E2: {.      /* E
4360: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
4370: 33 32 35 2d 34 38 33 37 38 20 54 68 65 20 53 51  325-48378 The SQ
4380: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
4390: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
43a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
43b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
43c0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
43d0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
43e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
43f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68     ** object. Th
4400: 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63 69 66  is object specif
4410: 69 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63  ies the interfac
4420: 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20 70 61  e to a custom pa
4430: 67 65 20 63 61 63 68 65 0a 20 20 20 20 20 20 2a  ge cache.      *
4440: 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
4450: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
4460: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4470: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
4480: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
4490: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
44a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
44c0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
44d0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
44e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
44f0: 32 32 30 33 35 2d 34 36 31 38 32 20 54 68 65 20  22035-46182 The 
4500: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4510: 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20  TPCACHE2 option 
4520: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
4530: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4540: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
4550: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
4560: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4570: 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  2.      ** objec
4580: 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73  t. SQLite copies
4590: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
45a0: 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65  page cache imple
45b0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20  mentation into. 
45c0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a       ** that obj
45d0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ect. */.      if
45e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
45f0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
4600: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
4610: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
4620: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
4630: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
4640: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
4650: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
4660: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
4670: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
4680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4690: 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d   }../* EVIDENCE-
46a0: 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32 39 31  OF: R-06626-1291
46b0: 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  1 The SQLITE_CON
46c0: 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20  FIG_HEAP option 
46d0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  is only.** avail
46e0: 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69  able if SQLite i
46f0: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
4700: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 45 4e  either SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a  ABLE_MEMSYS3 or.
4720: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
4730: 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72 65 74  _MEMSYS5 and ret
4740: 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f  urns SQLITE_ERRO
4750: 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68  R if invoked oth
4760: 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64  erwise. */.#if d
4770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4780: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
4790: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
47a0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
47b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
47c0: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
47d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
47e0: 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34 32 31  -OF: R-19854-421
47f0: 32 36 20 54 68 65 72 65 20 61 72 65 20 74 68 72  26 There are thr
4800: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
4810: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4820: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41 6e 20  CONFIG_HEAP: An 
4830: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 70  8-byte aligned p
4840: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65  ointer to the me
4850: 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20 20 20  mory, the.      
4860: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
4870: 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79  es in the memory
4880: 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74 68 65   buffer, and the
4890: 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   minimum allocat
48a0: 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20 20 20  ion size..      
48b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
48c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
48d0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
48e0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
48f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4900: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
4910: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4930: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
4940: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
4950: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4960: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4970: 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eq<1 ){.        
4980: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4990: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20  fig.mnReq = 1;. 
49a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
49b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
49c0: 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29  ig.mnReq>(1<<12)
49d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
49e0: 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73  ap min request s
49f0: 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20  ize at 2^12 */. 
4a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
4a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
4a20: 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20   = (1<<12);.    
4a30: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
4a40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4a50: 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
4a60: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
4a70: 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36  CE-OF: R-49920-6
4a80: 30 31 38 39 20 49 66 20 74 68 65 20 66 69 72 73  0189 If the firs
4a90: 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d  t pointer (the m
4aa0: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 0a 20  emory pointer). 
4ab0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c         ** is NUL
4ac0: 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 72  L, then SQLite r
4ad0: 65 76 65 72 74 73 20 74 6f 20 75 73 69 6e 67 20  everts to using 
4ae0: 69 74 73 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  its default memo
4af0: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20  ry allocator.   
4b00: 20 20 20 20 20 2a 2a 20 28 74 68 65 20 73 79 73       ** (the sys
4b10: 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70  tem malloc() imp
4b20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e  lementation), un
4b30: 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f 72 20  doing any prior 
4b40: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20  invocation of.  
4b50: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4b60: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20  CONFIG_MALLOC.. 
4b70: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4b80: 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 73 71 6c    ** Setting sql
4b90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4ba0: 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20  .m to all zeros 
4bb0: 77 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f  will cause mallo
4bc0: 63 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  c to.        ** 
4bd0: 72 65 76 65 72 74 20 74 6f 20 69 74 73 20 64 65  revert to its de
4be0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
4bf0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
4c00: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
4c10: 73 20 72 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f  s run.        */
4c20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
4c30: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
4c40: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
4c50: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
4c60: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
4c70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4c80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4c90: 52 2d 36 31 30 30 36 2d 30 38 39 31 38 20 49 66  R-61006-08918 If
4ca0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e   the memory poin
4cb0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
4cc0: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
4cd0: 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20   ** alternative 
4ce0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4cf0: 20 69 73 20 65 6e 67 61 67 65 64 20 74 6f 20 68   is engaged to h
4d00: 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c  andle all of SQL
4d10: 69 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ites.        ** 
4d20: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4d30: 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64  n needs. */.#ifd
4d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d50: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
4d60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4d70: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4d80: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
4d90: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4da0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4db0: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
4dc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4dd0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4de0: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
4df0: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
4e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e10: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
4e20: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4e30: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
4e40: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4e50: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
4e60: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
4e70: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4e90: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
4ea0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ec0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
4ed0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
4ee0: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
4ef0: 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72  tion and its fir
4f00: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
4f10: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
4f20: 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e  is NULL.  Loggin
4f30: 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66  g is disabled if
4f40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f   the function po
4f50: 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  inter is.    ** 
4f60: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
4f70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4f80: 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  FIG_LOG: {.     
4f90: 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
4fa0: 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
4fb0: 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
4fc0: 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
4fd0: 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
4fe0: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
4ff0: 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
5000: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5010: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
5020: 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76  rg(ap, void(*)(v
5030: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
5040: 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f  har*));.      */
5050: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
5060: 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28  oid(*LOGFUNC_t)(
5070: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
5080: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
5090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
50a0: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
50b0: 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a  ap, LOGFUNC_t);.
50c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72  balConfig.pLogAr
50e0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
50f0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  oid*);.      bre
5100: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5110: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5120: 2d 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65  -55548-33817 The
5130: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65   compile-time se
5140: 74 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69  tting for URI fi
5150: 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63  lenames.    ** c
5160: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74  an be changed at
5170: 20 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e   start-time usin
5180: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  g the.    ** sql
5190: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
51a0: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29  TE_CONFIG_URI,1)
51b0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
51c0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
51d0: 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63  _CONFIG_URI,0) c
51e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c  onfiguration cal
51f0: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
5200: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5210: 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f  G_URI: {.      /
5220: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5230: 2d 32 35 34 35 31 2d 36 31 31 32 35 20 54 68 65  -25451-61125 The
5240: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5250: 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  RI option takes 
5260: 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a  a single.      *
5270: 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  * argument of ty
5280: 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a  pe int. If non-z
5290: 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61  ero, then URI ha
52a0: 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c  ndling is global
52b0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  ly.      ** enab
52c0: 6c 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61  led. If the para
52d0: 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  meter is zero, t
52e0: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
52f0: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5300: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20     ** disabled. 
5310: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5320: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
5330: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
5340: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
5350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5360: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5370: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
5380: 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20  EX_SCAN: {.     
5390: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
53a0: 20 52 2d 33 36 35 39 32 2d 30 32 37 37 32 20 54   R-36592-02772 T
53b0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
53c0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53d0: 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70  SCAN.      ** op
53e0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
53f0: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
5400: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6e  ment which is in
5410: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 20  terpreted as a. 
5420: 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20       ** boolean 
5430: 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 61 62  in order to enab
5440: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
5450: 65 20 75 73 65 20 6f 66 20 63 6f 76 65 72 69 6e  e use of coverin
5460: 67 20 69 6e 64 69 63 65 73 20 66 6f 72 0a 20 20  g indices for.  
5470: 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c      ** full tabl
5480: 65 20 73 63 61 6e 73 20 69 6e 20 74 68 65 20 71  e scans in the q
5490: 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20  uery optimizer. 
54a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
54b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
54c0: 65 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70  eCis = va_arg(ap
54d0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
54e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
54f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5500: 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65  _SQLLOG.    case
5510: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
5520: 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74  QLLOG: {.      t
5530: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c  ypedef void(*SQL
5540: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5550: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
5560: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20  t char*, int);. 
5570: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5580: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
5590: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51   = va_arg(ap, SQ
55a0: 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20  LLOGFUNC_t);.   
55b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
55c0: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
55d0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
55e0: 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72  oid *);.      br
55f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5600: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
5610: 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53  TE_CONFIG_MMAP_S
5620: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IZE: {.      /* 
5630: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5640: 38 30 36 33 2d 33 38 32 35 38 20 53 51 4c 49 54  8063-38258 SQLIT
5650: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
5660: 5a 45 20 74 61 6b 65 73 20 74 77 6f 20 36 34 2d  ZE takes two 64-
5670: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  bit.      ** int
5680: 65 67 65 72 20 28 73 71 6c 69 74 65 33 5f 69 6e  eger (sqlite3_in
5690: 74 36 34 29 20 76 61 6c 75 65 73 20 74 68 61 74  t64) values that
56a0: 20 61 72 65 20 74 68 65 20 64 65 66 61 75 6c 74   are the default
56b0: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
56c0: 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 64  .      ** (the d
56d0: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 66  efault setting f
56e0: 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73  or PRAGMA mmap_s
56f0: 69 7a 65 29 20 61 6e 64 20 74 68 65 20 6d 61 78  ize) and the max
5700: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20  imum allowed.   
5710: 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20     ** mmap size 
5720: 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  limit. */.      
5730: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
5740: 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
5750: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
5760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5770: 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76  int64 mxMmap = v
5780: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
5790: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
57a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
57b0: 52 2d 35 33 33 36 37 2d 34 33 31 39 30 20 49 66  R-53367-43190 If
57c0: 20 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74   either argument
57d0: 20 74 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   to this option 
57e0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65 67 61  is.      ** nega
57f0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 61 74 20  tive, then that 
5800: 61 72 67 75 6d 65 6e 74 20 69 73 20 63 68 61 6e  argument is chan
5810: 67 65 64 20 74 6f 20 69 74 73 20 63 6f 6d 70 69  ged to its compi
5820: 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c 74 2e  le-time default.
5830: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5840: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
5850: 52 2d 33 34 39 39 33 2d 34 35 30 33 31 20 54 68  R-34993-45031 Th
5860: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5870: 64 20 6d 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c  d mmap size will
5880: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c   be.      ** sil
5890: 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 20  ently truncated 
58a0: 69 66 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  if necessary so 
58b0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
58c0: 20 65 78 63 65 65 64 20 74 68 65 0a 20 20 20 20   exceed the.    
58d0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
58e0: 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  e maximum mmap s
58f0: 69 7a 65 20 73 65 74 20 62 79 20 74 68 65 20 53  ize set by the S
5900: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
5910: 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  IZE.      ** com
5920: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
5930: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5940: 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c   if( mxMmap<0 ||
5950: 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d   mxMmap>SQLITE_M
5960: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a  AX_MMAP_SIZE ){.
5970: 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d          mxMmap =
5980: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
5990: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _SIZE;.      }. 
59a0: 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c       if( szMmap<
59b0: 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  0 ) szMmap = SQL
59c0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
59d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28  _SIZE;.      if(
59e0: 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20   szMmap>mxMmap) 
59f0: 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b  szMmap = mxMmap;
5a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
5a20: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a40: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73  onfig.szMmap = s
5a50: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65  zMmap;.      bre
5a60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53  ak;.    }..#if S
5a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20  QLITE_OS_WIN && 
5a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5a90: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20  IN32_MALLOC) /* 
5aa0: 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35 35 38  IMP: R-04780-558
5ab0: 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  15 */.    case S
5ac0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
5ad0: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
5ae0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5af0: 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30 33 33  -OF: R-34926-033
5b00: 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  60 SQLITE_CONFIG
5b10: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 20  _WIN32_HEAPSIZE 
5b20: 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74 0a 20  takes a 32-bit. 
5b30: 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64       ** unsigned
5b40: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74   integer value t
5b50: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
5b60: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
5b70: 66 20 74 68 65 20 63 72 65 61 74 65 64 0a 20 20  f the created.  
5b80: 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a      ** heap. */.
5b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5ba0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
5bb0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5bc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5bd0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5bf0: 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20  NFIG_PMASZ: {.  
5c00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5c10: 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20  lConfig.szPma = 
5c20: 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
5c30: 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
5c40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5c50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5c60: 4e 46 49 47 5f 53 54 4d 54 4a 52 4e 4c 5f 53 50  NFIG_STMTJRNL_SP
5c70: 49 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILL: {.      sql
5c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5c90: 2e 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 76 61  .nStmtSpill = va
5ca0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cc0: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
5cd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5ce0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
5cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5d00: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
5d10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5d20: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
5d30: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5d40: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
5d50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
5d60: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d70: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
5d80: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
5d90: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
5da0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
5db0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
5dc0: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
5dd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5de0: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
5df0: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
5e00: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
5e10: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5e20: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
5e30: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
5e40: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
5e50: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
5e60: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
5e70: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
5e80: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
5e90: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
5ea0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
5eb0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
5ec0: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
5ed0: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
5ee0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
5ef0: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
5f00: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
5f10: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
5f20: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66  z, int cnt){.#if
5f30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5f40: 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69  _LOOKASIDE.  voi
5f50: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
5f60: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
5f70: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
5f80: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
5f90: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
5fa0: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
5fb0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
5fc0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
5fd0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
5fe0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
5ff0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
6000: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
6010: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
6020: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
6030: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6040: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6050: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6060: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6070: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6080: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
6090: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
60a0: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
60b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
60c0: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
60d0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
60e0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
60f0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
6100: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
6110: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
6120: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
6130: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
6140: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
6150: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
6160: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
6170: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
6180: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
6190: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
61a0: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
61b0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
61c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
61d0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
61e0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
61f0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
6200: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
6210: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
6220: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
6230: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
6240: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6250: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
6260: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6270: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
6280: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
6290: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
62a0: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
62b0: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
62c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
62d0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
62e0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
62f0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
6300: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
6310: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
6320: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6330: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
6340: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
6350: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
6360: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
6370: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
6380: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
6390: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
63a0: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
63b0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
63c0: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
63d0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
63e0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
63f0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6400: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
6410: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
6420: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
6430: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6440: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
6450: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
6460: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6470: 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20  .pStart = db;.  
6480: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6490: 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64  pEnd = db;.    d
64a0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
64b0: 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 64  sable = 1;.    d
64c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
64d0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
64e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
64f0: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20  _OMIT_LOOKASIDE 
6500: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
6510: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6520: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
6530: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6540: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
6550: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
6560: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
6570: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
6580: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
6590: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
65a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
65b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
65c0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
65d0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
65e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
65f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
6600: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  f.  return db->m
6610: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
6620: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
6630: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
6640: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
6650: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
6660: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
6670: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
6680: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
6690: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  *db){.  int i;..
66a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
66b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
66c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
66d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
66e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
66f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6700: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6710: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6720: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6730: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6750: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6760: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6770: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6780: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
6790: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
67a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
67b0: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
67c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
67d0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
67e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
67f0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6810: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6820: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
6830: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6840: 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74  * Flush any dirt
6850: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
6860: 61 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61  ager-cache for a
6870: 6e 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ny attached data
6880: 62 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e  base.** to disk.
6890: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
68a0: 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71  db_cacheflush(sq
68b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
68c0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
68d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
68e0: 20 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a   bSeenBusy = 0;.
68f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6900: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6910: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6920: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6930: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6940: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
6950: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
6960: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6970: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
6980: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
6990: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
69a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
69b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
69c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
69d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
69e0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
69f0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
6a00: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
6a10: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
6a20: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
6a30: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
6a40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6a50: 65 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b  erFlush(pPager);
6a60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6a70: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
6a80: 20 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20        bSeenBusy 
6a90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
6aa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6ab0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6ac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6ad0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6ae0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6af0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6b00: 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
6b10: 54 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75  TE_OK && bSeenBu
6b20: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
6b30: 59 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Y : rc);.}../*.*
6b40: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
6b50: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
6b60: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
6b70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
6b80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6b90: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
6ba0: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
6bb0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6bc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
6bd0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
6be0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
6bf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6c00: 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  BCONFIG_LOOKASID
6c10: 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  E: {.      void 
6c20: 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61  *pBuf = va_arg(a
6c30: 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d  p, void*); /* IM
6c40: 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34  P: R-26835-10964
6c50: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
6c60: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6c70: 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50  t);       /* IMP
6c80: 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20  : R-47871-25994 
6c90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
6ca0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6cb0: 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  t);      /* IMP:
6cc0: 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a   R-04460-53386 *
6cd0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74  /.      rc = set
6ce0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
6cf0: 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a  pBuf, sz, cnt);.
6d00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d10: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6d20: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
6d30: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
6d40: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
6d50: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6d60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
6d70: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b  mask;    /* Mask
6d80: 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73   of the bit in s
6d90: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20  qlite3.flags to 
6da0: 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20  set/clear */.   
6db0: 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d     } aFlagOp[] =
6dc0: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c   {.        { SQL
6dd0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
6de0: 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 20 20 20  BLE_FKEY,       
6df0: 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69      SQLITE_Forei
6e00: 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20  gnKeys    },.   
6e10: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
6e20: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
6e30: 49 47 47 45 52 2c 20 20 20 20 20 20 20 20 53 51  IGGER,        SQ
6e40: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
6e50: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  er  },.        {
6e60: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
6e70: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
6e80: 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46  ENIZER, SQLITE_F
6e90: 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c  ts3Tokenizer  },
6ea0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
6eb0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6ec0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ed0: 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a  E_ERROR; /* IMP:
6ee0: 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a   R-42790-23372 *
6ef0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
6f00: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c   i<ArraySize(aFl
6f10: 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  agOp); i++){.   
6f20: 20 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70       if( aFlagOp
6f30: 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20  [i].op==op ){.  
6f40: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66          int onof
6f50: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  f = va_arg(ap, i
6f60: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
6f70: 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72  nt *pRes = va_ar
6f80: 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
6f90: 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c         int oldFl
6fa0: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
6fb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
6fc0: 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  noff>0 ){.      
6fd0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6fe0: 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  |= aFlagOp[i].ma
6ff0: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  sk;.          }e
7000: 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30  lse if( onoff==0
7010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7020: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46  db->flags &= ~aF
7030: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20  lagOp[i].mask;. 
7040: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7050: 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67       if( oldFlag
7060: 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a  s!=db->flags ){.
7070: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7080: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
7090: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
70a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
70b0: 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20         if( pRes 
70c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
70d0: 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  pRes = (db->flag
70e0: 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  s & aFlagOp[i].m
70f0: 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20  ask)!=0;.       
7100: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
7110: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7120: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7130: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7140: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7150: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
7160: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
7170: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
7180: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
7190: 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31   buffer z[0..n-1
71a0: 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73  ] contains all s
71b0: 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
71c0: 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63   int allSpaces(c
71d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
71e0: 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t n){.  while( n
71f0: 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20  >0 && z[n-1]==' 
7200: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65  ' ){ n--; }.  re
7210: 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn n==0;.}../*
7220: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
7230: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
7240: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  g function named
7250: 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20   "BINARY" which 
7260: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61  is always.** ava
7270: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ilable..**.** If
7280: 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67   the padFlag arg
7290: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
72a0: 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64  L then space pad
72b0: 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  ding at the end.
72c0: 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73  ** of strings is
72d0: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
72e0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52  implements the R
72f0: 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  TRIM collation..
7300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69  */.static int bi
7310: 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  nCollFunc(.  voi
7320: 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e  d *padFlag,.  in
7330: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7340: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
7350: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
7360: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7370: 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
7380: 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
7390: 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
73a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
73b0: 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68  R-65033-28449 Th
73c0: 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52  e built-in BINAR
73d0: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70  Y collation comp
73e0: 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ares.  ** string
73f0: 73 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75  s byte by byte u
7400: 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28  sing the memcmp(
7410: 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  ) function from 
7420: 74 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20  the standard C. 
7430: 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a   ** library. */.
7440: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
7450: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
7460: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
7470: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
7480: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
7490: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
74a0: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
74b0: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
74c0: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
74d0: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
74e0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
74f0: 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34  E-OF: R-31624-24
7500: 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b  737 RTRIM is lik
7510: 65 20 42 49 4e 41 52 59 20 65 78 63 65 70 74 20  e BINARY except 
7520: 74 68 61 74 20 65 78 74 72 61 0a 20 20 20 20 20  that extra.     
7530: 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74 68   ** spaces at th
7540: 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20  e end of either 
7550: 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68  string do not ch
7560: 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e  ange the result.
7570: 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20   In other.      
7580: 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67  ** words, string
7590: 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65  s will compare e
75a0: 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  qual to one anot
75b0: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  her as long as t
75c0: 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66  hey.      ** dif
75d0: 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20  fer only in the 
75e0: 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73  number of spaces
75f0: 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20   at the end..   
7600: 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
7610: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
7620: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
7630: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
7650: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
7660: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
7670: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
7680: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
7690: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
76a0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
76b0: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
76c0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
76d0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
76e0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
76f0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
7700: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
7710: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
7720: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
7730: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
7740: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
7750: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
7760: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
7770: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
7780: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
7790: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
77a0: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
77b0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
77c0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
77d0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
77e0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
77f0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7800: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
7810: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
7820: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7830: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
7840: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
7850: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
7860: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
7870: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
7880: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
7890: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
78a0: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
78b0: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
78c0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
78d0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
78e0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
78f0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
7900: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7910: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
7920: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7930: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
7940: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7950: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
7960: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
7970: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
7980: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7990: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
79a0: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
79b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
79c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
79d0: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
79e0: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
79f0: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
7a00: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
7a10: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
7a20: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7a30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
7a40: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
7a50: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
7a60: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
7a70: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
7a80: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
7a90: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7aa0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
7ab0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
7ac0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7ad0: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
7ae0: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
7af0: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
7b00: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7b10: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
7b20: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7b30: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7b40: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7b50: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7b60: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7b70: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7b80: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7b90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7ba0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7bb0: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
7bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7bd0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
7be0: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
7bf0: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
7c00: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
7c10: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
7c20: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
7c30: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
7c40: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
7c50: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
7c60: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
7c70: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
7c80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
7c90: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
7ca0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
7cb0: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
7cc0: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
7cd0: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
7ce0: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
7cf0: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
7d00: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
7d10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7d20: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
7d30: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
7d40: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
7d50: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
7d60: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
7d70: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
7d80: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
7d90: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
7da0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
7db0: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
7dc0: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
7dd0: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
7de0: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
7df0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
7e00: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
7e10: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
7e20: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
7e30: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
7e40: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
7e50: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
7e60: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
7e70: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
7e80: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
7e90: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
7ea0: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
7eb0: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
7ec0: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
7ed0: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
7ee0: 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72  or = p->u.pDestr
7ef0: 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65  uctor;.  if( pDe
7f00: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
7f10: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
7f20: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  f--;.    if( pDe
7f30: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d  structor->nRef==
7f40: 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74  0 ){.      pDest
7f50: 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79  ructor->xDestroy
7f60: 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55  (pDestructor->pU
7f70: 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
7f80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7f90: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
7fa0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7fb0: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c  ** Disconnect al
7fc0: 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  l sqlite3_vtab o
7fd0: 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f  bjects that belo
7fe0: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
7ff0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e  onnection.** db.
8000: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
8010: 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67  when db is being
8020: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
8030: 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65  ic void disconne
8040: 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65  ctAllVtab(sqlite
8050: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
8060: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8070: 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69  UALTABLE.  int i
8080: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b  ;.  HashElem *p;
8090: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
80a0: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
80b0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
80c0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68  b; i++){.    Sch
80d0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
80e0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
80f0: 61 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  a;.    if( db->a
8100: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[i].pSchema ){
8110: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
8120: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
8130: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
8140: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
8150: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
8160: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8170: 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48  (Table *)sqliteH
8180: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
8190: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
81a0: 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65  l(pTab) ) sqlite
81b0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
81c0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
81d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
81e0: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
81f0: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
8200: 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48  e); p; p=sqliteH
8210: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
8220: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
8230: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
8240: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
8250: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54   if( pMod->pEpoT
8260: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
8270: 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  te3VtabDisconnec
8280: 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f  t(db, pMod->pEpo
8290: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
82a0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
82b0: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
82c0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
82d0: 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20  All(db);.#else. 
82e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
82f0: 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  R(db);.#endif.}.
8300: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
8310: 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20 63  UE if database c
8320: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73  onnection db has
8330: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
8340: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
8350: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
8360: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
8370: 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73   objects.  .*/.s
8380: 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63  tatic int connec
8390: 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74  tionIsBusy(sqlit
83a0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a  e3 *db){.  int j
83b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
83c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
83d0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
83e0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72  f( db->pVdbe ) r
83f0: 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a  eturn 1;.  for(j
8400: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
8410: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
8420: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  pBt = db->aDb[j]
8430: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
8440: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
8450: 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29  eIsInBackup(pBt)
8460: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
8470: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8480: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
8490: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
84a0: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
84b0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f  c int sqlite3Clo
84c0: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  se(sqlite3 *db, 
84d0: 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29  int forceZombie)
84e0: 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  {.  if( !db ){. 
84f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
8500: 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30  F: R-63257-11740
8510: 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   Calling sqlite3
8520: 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20  _close() or.    
8530: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  ** sqlite3_close
8540: 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c  _v2() with a NUL
8550: 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65  L pointer argume
8560: 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  nt is a harmless
8570: 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72   no-op. */.    r
8580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8590: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
85a0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
85b0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
85c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
85d0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
85e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
85f0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8600: 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78  );..  /* Force x
8610: 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73  Disconnect calls
8620: 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   on all virtual 
8630: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63  tables */.  disc
8640: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62  onnectAllVtab(db
8650: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  );..  /* If a tr
8660: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
8670: 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63  n, the disconnec
8680: 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20  tAllVtab() call 
8690: 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  above.  ** will 
86a0: 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20  not have called 
86b0: 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28  the xDisconnect(
86c0: 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20  ) method on any 
86d0: 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62  virtual.  ** tab
86e0: 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61  les in the db->a
86f0: 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20  VTrans[] array. 
8700: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  The following sq
8710: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
8720: 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69  k().  ** call wi
8730: 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65  ll do so. We nee
8740: 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66  d to do this bef
8750: 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f  ore the check fo
8760: 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51  r active.  ** SQ
8770: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c  L statements bel
8780: 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62  ow, as the v-tab
8790: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
87a0: 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67  n may be storing
87b0: 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61  .  ** some prepa
87c0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69  red statements i
87d0: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
87e0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
87f0: 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a  lback(db);..  /*
8800: 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72   Legacy behavior
8810: 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28   (sqlite3_close(
8820: 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20 74  ) behavior) is t
8830: 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  o return.  ** SQ
8840: 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65  LITE_BUSY if the
8850: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20   connection can 
8860: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
8870: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  mediately..  */.
8880: 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62    if( !forceZomb
8890: 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e  ie && connection
88a0: 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20  IsBusy(db) ){.  
88b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
88c0: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
88d0: 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74  _BUSY, "unable t
88e0: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
88f0: 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20  nfinalized ".   
8900: 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20      "statements 
8910: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  or unfinished ba
8920: 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c  ckups");.    sql
8930: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8940: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
8950: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
8960: 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  USY;.  }..#ifdef
8970: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
8980: 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
8990: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
89a0: 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
89b0: 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61  * Closing the ha
89c0: 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
89d0: 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
89e0: 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f   the value 2. */
89f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
8a00: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
8a10: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
8a20: 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
8a30: 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a   db, 0, 2);.  }.
8a40: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e  #endif..  /* Con
8a50: 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  vert the connect
8a60: 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69  ion into a zombi
8a70: 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65  e and then close
8a80: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e   it..  */.  db->
8a90: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
8aa0: 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73  AGIC_ZOMBIE;.  s
8ab0: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
8ac0: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64  AndCloseZombie(d
8ad0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
8ae0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8af0: 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20   Two variations 
8b00: 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e  on the public in
8b10: 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73  terface for clos
8b20: 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
8b30: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  * connection. Th
8b40: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  e sqlite3_close(
8b50: 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e  ) version return
8b60: 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  s SQLITE_BUSY an
8b70: 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20  d.** leaves the 
8b80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f  connection optio
8b90: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 75  n if there are u
8ba0: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
8bb0: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
8bc0: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
8bd0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e  sqlite3_backups.
8be0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c    The sqlite3_cl
8bf0: 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73  ose_v2().** vers
8c00: 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63  ion forces the c
8c10: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63  onnection to bec
8c20: 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20  ome a zombie if 
8c30: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63  there are.** unc
8c40: 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c  losed resources,
8c50: 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f   and arranges fo
8c60: 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  r deallocation w
8c70: 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  hen the last.** 
8c80: 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e  prepare statemen
8c90: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
8ca0: 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69  kup closes..*/.i
8cb0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
8cc0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8cd0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8ce0: 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20  se(db,0); }.int 
8cf0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8d00: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8d10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8d20: 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a  se(db,1); }.../*
8d30: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75  .** Close the mu
8d40: 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
8d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a  connection db..*
8d60: 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  *.** Furthermore
8d70: 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  , if database co
8d80: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61  nnection db is a
8d90: 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67   zombie (meaning
8da0: 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68   that there.** h
8db0: 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20  as been a prior 
8dc0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
8dd0: 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c  close(db) or sql
8de0: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62  ite3_close_v2(db
8df0: 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20  )) and.** every 
8e00: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73  sqlite3_stmt has
8e10: 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69   now been finali
8e20: 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73 71  zed and every sq
8e30: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73  lite3_backup has
8e40: 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68  .** finished, th
8e50: 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  en free all reso
8e60: 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urces..*/.void s
8e70: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
8e80: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73  AndCloseZombie(s
8e90: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
8ea0: 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20  ashElem *i;     
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ec0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65  * Hash table ite
8ed0: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  rator */.  int j
8ee0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
8ef0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
8f00: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72   sqlite3_stmt or
8f10: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8f20: 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20  objects.  ** or 
8f30: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
8f40: 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  n has not yet be
8f50: 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c  en closed by sql
8f60: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c  ite3_close_v2(),
8f70: 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20  .  ** then just 
8f80: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
8f90: 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
8fa0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63  .  if( db->magic
8fb0: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  !=SQLITE_MAGIC_Z
8fc0: 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74  OMBIE || connect
8fd0: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
8fe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
8ff0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
9000: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ex);.    return;
9010: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
9020: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
9030: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
9040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9050: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a  nnection has.  *
9060: 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c  * closed all sql
9070: 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71  ite3_stmt and sq
9080: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
9090: 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65 65  ects and has bee
90a0: 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f  n.  ** passed to
90b0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28   sqlite3_close (
90c0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
90d0: 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54  is a zombie).  T
90e0: 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67  herefore,.  ** g
90f0: 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65 65  o ahead and free
9100: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a   all resources..
9110: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20    */..  /* If a 
9120: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
9130: 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63  pen, roll it bac
9140: 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73  k. This also ens
9150: 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a  ures that if.  *
9160: 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 73  * any database s
9170: 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e  chemas have been
9180: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20   modified by an 
9190: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  uncommitted tran
91a0: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65  saction.  ** the
91b0: 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64  y are reset. And
91c0: 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69 72   that the requir
91d0: 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
91e0: 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a  is held to make.
91f0: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72    ** the pager r
9200: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
9210: 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d  ma reset an atom
9220: 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f  ic operation. */
9230: 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  .  sqlite3Rollba
9240: 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
9250: 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  _OK);..  /* Free
9260: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
9270: 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63   Savepoint struc
9280: 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tures. */.  sqli
9290: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
92a0: 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c  ts(db);..  /* Cl
92b0: 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ose all database
92c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
92d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
92e0: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
92f0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
9300: 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20   &db->aDb[j];.  
9310: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
9320: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
9330: 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70  treeClose(pDb->p
9340: 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  Bt);.      pDb->
9350: 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pBt = 0;.      i
9360: 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20  f( j!=1 ){.     
9370: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20     pDb->pSchema 
9380: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9390: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61   }.  }.  /* Clea
93a0: 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d  r the TEMP schem
93b0: 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64  a separately and
93c0: 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64   last */.  if( d
93d0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
93e0: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
93f0: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
9400: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
9410: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
9420: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
9430: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20  ;..  /* Free up 
9440: 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75 78  the array of aux
9450: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
9460: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   */.  sqlite3Col
9470: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
9480: 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ay(db);.  assert
9490: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
94a0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
94b0: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
94c0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74   );..  /* Tell t
94d0: 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66  he code in notif
94e0: 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e  y.c that the con
94f0: 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65  nection no longe
9500: 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a  r holds any.  **
9510: 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20   locks and does 
9520: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
9530: 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e  further unlock-n
9540: 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
9550: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
9560: 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28  onnectionClosed(
9570: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71  db);..  for(i=sq
9580: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
9590: 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d  b->aFunc); i; i=
95a0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
95b0: 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  )){.    FuncDef 
95c0: 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20  *pNext, *p;.    
95d0: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  p = sqliteHashDa
95e0: 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  ta(i);.    do{. 
95f0: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
9600: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
9610: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
9620: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
9630: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
9640: 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74  .      p = pNext
9650: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20  ;.    }while( p 
9660: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9670: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
9680: 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73  Func);.  for(i=s
9690: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
96a0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69  db->aCollSeq); i
96b0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
96c0: 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c  xt(i)){.    Coll
96d0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
96e0: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
96f0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f  shData(i);.    /
9700: 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73  * Invoke any des
9710: 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65  tructors registe
9720: 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f  red for collatio
9730: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20  n sequence user 
9740: 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  data. */.    for
9750: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
9760: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
9770: 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20  [j].xDel ){.    
9780: 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65      pColl[j].xDe
9790: 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72  l(pColl[j].pUser
97a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
97b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
97c0: 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20  ee(db, pColl);. 
97d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
97e0: 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c  Clear(&db->aColl
97f0: 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
9800: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9810: 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73  LTABLE.  for(i=s
9820: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9830: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b  db->aModule); i;
9840: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
9850: 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(i)){.    Modul
9860: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
9870: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
9880: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
9890: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b  Mod->xDestroy ){
98a0: 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65  .      pMod->xDe
98b0: 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78  stroy(pMod->pAux
98c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
98d0: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
98e0: 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20  sTableClear(db, 
98f0: 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  pMod);.    sqlit
9900: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
9910: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
9920: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
9930: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
9940: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
9950: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
9960: 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20   /* Deallocates 
9970: 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72  any cached error
9980: 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73   strings. */.  s
9990: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
99a0: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c  db->pErr);.  sql
99b0: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
99c0: 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c  ons(db);.#if SQL
99d0: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
99e0: 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65  ICATION.  sqlite
99f0: 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e  3_free(db->auth.
9a00: 7a 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71  zAuthUser);.  sq
9a10: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
9a20: 75 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65  uth.zAuthPW);.#e
9a30: 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  ndif..  db->magi
9a40: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
9a50: 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68  _ERROR;..  /* Th
9a60: 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20  e temp-database 
9a70: 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61  schema is alloca
9a80: 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  ted differently 
9a90: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73  from the other s
9aa0: 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63  chema.  ** objec
9ab0: 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65  ts (using sqlite
9ac0: 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c  Malloc() directl
9ad0: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71  y, instead of sq
9ae0: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
9af0: 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20  ())..  ** So it 
9b00: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
9b10: 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68  d here. Todo: Wh
9b20: 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74  y not roll the t
9b30: 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a  emp schema into.
9b40: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71    ** the same sq
9b50: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20  liteMalloc() as 
9b60: 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c  the one that all
9b70: 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62  ocates the datab
9b80: 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74  ase .  ** struct
9b90: 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ure?.  */.  sqli
9ba0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62  te3DbFree(db, db
9bb0: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
9bc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9bd0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
9be0: 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  ex);.  db->magic
9bf0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
9c00: 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65  CLOSED;.  sqlite
9c10: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d  3_mutex_free(db-
9c20: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
9c30: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
9c40: 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  .nOut==0 );  /* 
9c50: 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61  Fails on a looka
9c60: 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  side memory leak
9c70: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f   */.  if( db->lo
9c80: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
9c90: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
9ca0: 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73  _free(db->lookas
9cb0: 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d  ide.pStart);.  }
9cc0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9cd0: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  db);.}../*.** Ro
9ce0: 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62  llback all datab
9cf0: 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74  ase files.  If t
9d00: 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53  ripCode is not S
9d10: 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a  QLITE_OK, then.*
9d20: 2a 20 61 6e 79 20 77 72 69 74 65 20 63 75 72 73  * any write curs
9d30: 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
9d40: 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d  ted ("tripped" -
9d50: 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67   as in "tripping
9d60: 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72   a circuit.** br
9d70: 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65  eaker") and made
9d80: 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43   to return tripC
9d90: 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65  ode if there are
9da0: 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20   any further.** 
9db0: 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20  attempts to use 
9dc0: 74 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65  that cursor.  Re
9dd0: 61 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69  ad cursors remai
9de0: 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64  n open and valid
9df0: 0a 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61 76  .** but are "sav
9e00: 65 64 22 20 69 6e 20 63 61 73 65 20 74 68 65 20  ed" in case the 
9e10: 74 61 62 6c 65 20 70 61 67 65 73 20 61 72 65 20  table pages are 
9e20: 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f  moved around..*/
9e30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
9e40: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
9e50: 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f   *db, int tripCo
9e60: 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  de){.  int i;.  
9e70: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
9e80: 0a 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61  .  int schemaCha
9e90: 6e 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  nge;.  assert( s
9ea0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9eb0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
9ec0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
9ed0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
9ee0: 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62   /* Obtain all b
9ef0: 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65  -tree mutexes be
9f00: 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20  fore making any 
9f10: 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f  calls to BtreeRo
9f20: 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20  llback(). .  ** 
9f30: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
9f40: 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72  t in case the tr
9f50: 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20  ansaction being 
9f60: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a  rolled back has.
9f70: 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68    ** modified th
9f80: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
9f90: 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  a. If the b-tree
9fa0: 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74   mutexes are not
9fb0: 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65   taken.  ** here
9fc0: 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73  , then another s
9fd0: 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e  hared-cache conn
9fe0: 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65  ection might sne
9ff0: 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20  ak in between.  
a000: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
a010: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
a020: 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68  ema reset, which
a030: 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65   can cause false
a040: 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  .  ** corruption
a050: 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65   reports in some
a060: 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71   cases.  */.  sq
a070: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
a080: 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61  ll(db);.  schema
a090: 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c  Change = (db->fl
a0a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
a0b0: 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26  ernChanges)!=0 &
a0c0: 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
a0d0: 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  =0;..  for(i=0; 
a0e0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a0f0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
a100: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
a110: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
a120: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
a130: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20  reeIsInTrans(p) 
a140: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
a150: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
a160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
a170: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72  eeRollback(p, tr
a180: 69 70 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43  ipCode, !schemaC
a190: 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hange);.    }.  
a1a0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  }.  sqlite3VtabR
a1b0: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73  ollback(db);.  s
a1c0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
a1d0: 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20  alloc();..  if( 
a1e0: 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
a1f0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
a200: 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  !=0 && db->init.
a210: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73  busy==0 ){.    s
a220: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
a230: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
a240: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
a250: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
a260: 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
a270: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
a280: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
a290: 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72  .  /* Any deferr
a2a0: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ed constraint vi
a2b0: 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f  olations have no
a2c0: 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  w been resolved.
a2d0: 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72   */.  db->nDefer
a2e0: 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64  redCons = 0;.  d
a2f0: 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
a300: 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66  ons = 0;.  db->f
a310: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
a320: 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20  DeferFKs;..  /* 
a330: 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20  If one has been 
a340: 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f  configured, invo
a350: 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d  ke the rollback-
a360: 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  hook callback */
a370: 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c  .  if( db->xRoll
a380: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20  backCallback && 
a390: 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d  (inTrans || !db-
a3a0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a  >autoCommit) ){.
a3b0: 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63      db->xRollbac
a3c0: 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52  kCallback(db->pR
a3d0: 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d  ollbackArg);.  }
a3e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a3f0: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
a400: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
a410: 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  name correspondi
a420: 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ng to the error 
a430: 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65  code.** specifie
a440: 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  d in the argumen
a450: 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  t..*/.#if define
a460: 64 28 53 51 4c 49 54 45 5f 4e 45 45 44 5f 45 52  d(SQLITE_NEED_ER
a470: 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73 74 20 63 68  R_NAME).const ch
a480: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
a490: 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f  me(int rc){.  co
a4a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
a4b0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72  = 0;.  int i, or
a4c0: 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72  igRc = rc;.  for
a4d0: 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61  (i=0; i<2 && zNa
a4e0: 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26  me==0; i++, rc &
a4f0: 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69  = 0xff){.    swi
a500: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20  tch( rc ){.     
a510: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a540: 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20  _OK";           
a550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a560: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
a570: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
a580: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a590: 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20  E_ERROR";       
a5a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a5b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a5c0: 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20  NTERNAL:        
a5d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a5e0: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
a5f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a600: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a610: 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20  PERM:           
a620: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a630: 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20  ITE_PERM";      
a640: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a650: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a660: 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20  _ABORT:         
a670: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a680: 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20  LITE_ABORT";    
a690: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a6a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a6b0: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
a6c0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
a6d0: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
a6e0: 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b  BACK";    break;
a6f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a700: 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20  TE_BUSY:        
a710: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a720: 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20  SQLITE_BUSY";   
a730: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a740: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a750: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
a760: 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  Y:      zName = 
a770: 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43  "SQLITE_BUSY_REC
a780: 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72 65 61  OVERY";     brea
a790: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a7a0: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
a7b0: 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  OT:      zName =
a7c0: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e   "SQLITE_BUSY_SN
a7d0: 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65  APSHOT";     bre
a7e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a7f0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
a800: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a810: 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  = "SQLITE_LOCKED
a820: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
a830: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a840: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
a850: 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65  AREDCACHE: zName
a860: 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   = "SQLITE_LOCKE
a870: 44 5f 53 48 41 52 45 44 43 41 43 48 45 22 3b 62  D_SHAREDCACHE";b
a880: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a890: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20   SQLITE_NOMEM:  
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
a8b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  e = "SQLITE_NOME
a8c0: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
a8d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a8e0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
a8f0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  Y:           zNa
a900: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
a910: 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20  DONLY";         
a920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a930: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
a940: 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e  LY_RECOVERY:  zN
a950: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
a960: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22  ADONLY_RECOVERY"
a970: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
a980: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
a990: 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a  NLY_CANTLOCK:  z
a9a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
a9b0: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
a9c0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
a9d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
a9e0: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  ONLY_ROLLBACK:  
a9f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aa00: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
aa10: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
aa20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
aa30: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20  DONLY_DBMOVED:  
aa40: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aa50: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
aa60: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
aa70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
aa80: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
aa90: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aaa0: 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20  E_INTERRUPT";   
aab0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aac0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
aad0: 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20  OERR:           
aae0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
aaf0: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
ab00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ab10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ab20: 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20  IOERR_READ:     
ab30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ab40: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b  ITE_IOERR_READ";
ab50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ab60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ab70: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
ab80: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
ab90: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
aba0: 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a  _READ";  break;.
abb0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
abc0: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20  E_IOERR_WRITE:  
abd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
abe0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
abf0: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
ac00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ac10: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20  TE_IOERR_FSYNC: 
ac20: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ac30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
ac40: 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  NC";       break
ac50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ac60: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
ac70: 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  YNC:    zName = 
ac80: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
ac90: 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61  R_FSYNC";   brea
aca0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
acb0: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
acc0: 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATE:     zName =
acd0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54   "SQLITE_IOERR_T
ace0: 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65  RUNCATE";    bre
acf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ad00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
ad10: 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  T:        zName 
ad20: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ad30: 46 53 54 41 54 22 3b 20 20 20 20 20 20 20 62 72  FSTAT";       br
ad40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
ad60: 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  OCK:       zName
ad70: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ad80: 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62  _UNLOCK";      b
ad90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ada0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
adb0: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LOCK:       zNam
adc0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
add0: 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20  R_RDLOCK";      
ade0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
adf0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
ae00: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61  ELETE:       zNa
ae10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ae20: 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20  RR_DELETE";     
ae30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ae40: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ae50: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e  NOMEM:        zN
ae60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ae70: 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ERR_NOMEM";     
ae80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ae90: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
aea0: 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a  _ACCESS:       z
aeb0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
aec0: 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20  OERR_ACCESS";   
aed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aee0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
aef0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
af00: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OCK:.           
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
af30: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
af40: 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62  RESERVEDLOCK"; b
af50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
af60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
af70: 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  CK:         zNam
af80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
af90: 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20  R_LOCK";        
afa0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
afb0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
afc0: 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61  LOSE:        zNa
afd0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
afe0: 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20  RR_CLOSE";      
aff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b000: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b010: 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e  DIR_CLOSE:    zN
b020: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b030: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20  ERR_DIR_CLOSE"; 
b040: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b050: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b060: 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a  _SHMOPEN:      z
b070: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b080: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20  OERR_SHMOPEN";  
b090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b0a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b0b0: 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20  R_SHMSIZE:      
b0c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b0d0: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20  IOERR_SHMSIZE"; 
b0e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b0f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b100: 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20  RR_SHMLOCK:     
b110: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b120: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b  _IOERR_SHMLOCK";
b130: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b140: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b150: 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20  ERR_SHMMAP:     
b160: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b170: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b  E_IOERR_SHMMAP";
b180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b190: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b1a0: 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20  OERR_SEEK:      
b1b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b1c0: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20  TE_IOERR_SEEK"; 
b1d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b1e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1f0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
b200: 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  NT: zName = "SQL
b210: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b220: 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20  _NOENT";break;. 
b230: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b240: 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20  _IOERR_MMAP:    
b250: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b260: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22  LITE_IOERR_MMAP"
b270: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
b280: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b290: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
b2a0: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
b2b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
b2c0: 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  EMPPATH"; break;
b2d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b2e0: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
b2f0: 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  H:     zName = "
b300: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
b310: 56 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b  VPATH";    break
b320: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b330: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
b340: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b350: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22  "SQLITE_CORRUPT"
b360: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
b370: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b380: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
b390: 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  B:       zName =
b3a0: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
b3b0: 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65  _VTAB";      bre
b3c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b3d0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20  QLITE_NOTFOUND: 
b3e0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b3f0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  = "SQLITE_NOTFOU
b400: 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  ND";          br
b410: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b420: 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20  SQLITE_FULL:    
b430: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b440: 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22   = "SQLITE_FULL"
b450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
b460: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b470: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
b480: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
b490: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
b4a0: 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20  OPEN";          
b4b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b4c0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
b4d0: 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61  N_NOTEMPDIR: zNa
b4e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
b4f0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22  TOPEN_NOTEMPDIR"
b500: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b510: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
b520: 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e  EN_ISDIR:     zN
b530: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
b540: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20  NTOPEN_ISDIR";  
b550: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b560: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
b570: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a  PEN_FULLPATH:  z
b580: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b590: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
b5a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b5b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
b5c0: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OPEN_CONVPATH:  
b5d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b5e0: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
b5f0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
b600: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f   case SQLITE_PRO
b610: 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20  TOCOL:          
b620: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b630: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20  _PROTOCOL";     
b640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b650: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
b660: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
b670: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b680: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
b690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b6a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
b6b0: 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20  CHEMA:          
b6c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b6d0: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
b6e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b6f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b700: 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20  TOOBIG:         
b710: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b720: 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20  ITE_TOOBIG";    
b730: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b740: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b750: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20  _CONSTRAINT:    
b760: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b770: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
b780: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
b790: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b7a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
b7b0: 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  QUE:  zName = "S
b7c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b7d0: 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b  _UNIQUE"; break;
b7e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b7f0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
b800: 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22  IGGER: zName = "
b810: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b820: 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b  T_TRIGGER";break
b830: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b840: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
b850: 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20  OREIGNKEY:.     
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b880: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b890: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
b8a0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
b8b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b8c0: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20  NSTRAINT_CHECK: 
b8d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b8e0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
b8f0: 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CK";  break;.   
b900: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b910: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
b920: 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  YKEY:.          
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b950: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b960: 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20  _PRIMARYKEY";   
b970: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b980: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b990: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61  INT_NOTNULL: zNa
b9a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b9b0: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22  STRAINT_NOTNULL"
b9c0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b9d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b9e0: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a  AINT_COMMITHOOK:
b9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ba20: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
ba30: 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b  ITHOOK";   break
ba40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ba50: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
ba60: 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TAB:    zName = 
ba70: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
ba80: 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61  NT_VTAB";   brea
ba90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
baa0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bab0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bae0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
baf0: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20  AINT_FUNCTION"; 
bb00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bb10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bb20: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20  STRAINT_ROWID:  
bb30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bb40: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
bb50: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
bb60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
bb70: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
bb80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bb90: 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20  E_MISMATCH";    
bba0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bbb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
bbc0: 49 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20  ISUSE:          
bbd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bbe0: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
bbf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bc00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bc10: 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20  NOLFS:          
bc20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bc30: 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20  ITE_NOLFS";     
bc40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bc50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bc60: 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20  _AUTH:          
bc70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bc80: 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20  LITE_AUTH";     
bc90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bca0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bcb0: 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20  E_FORMAT:       
bcc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bcd0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20  QLITE_FORMAT";  
bce0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bcf0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bd00: 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20  TE_RANGE:       
bd10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bd20: 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20  SQLITE_RANGE";  
bd30: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bd40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bd50: 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20  ITE_NOTADB:     
bd60: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bd70: 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b  "SQLITE_NOTADB";
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bd90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bda0: 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20  LITE_ROW:       
bdb0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bdc0: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20   "SQLITE_ROW";  
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
bde0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bdf0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20  QLITE_NOTICE:   
be00: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
be10: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
be20: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
be30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
be40: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
be50: 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65  COVER_WAL: zName
be60: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
be70: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62  E_RECOVER_WAL";b
be80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
be90: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52   SQLITE_NOTICE_R
bea0: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a  ECOVER_ROLLBACK:
beb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bee0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
bef0: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
bf00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bf10: 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20  ITE_WARNING:    
bf20: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bf30: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22  "SQLITE_WARNING"
bf40: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
bf50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bf60: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
bf70: 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d  OINDEX:  zName =
bf80: 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47   "SQLITE_WARNING
bf90: 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65  _AUTOINDEX"; bre
bfa0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bfb0: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20  QLITE_DONE:     
bfc0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bfd0: 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b  = "SQLITE_DONE";
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
bff0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
c000: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
c010: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
c020: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73   zBuf[50];.    s
c030: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c040: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
c050: 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e  uf, "SQLITE_UNKN
c060: 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63  OWN(%d)", origRc
c070: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a  );.    zName = z
c080: 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Buf;.  }.  retur
c090: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
c0a0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
c0b0: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
c0c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
c0d0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
c0e0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
c0f0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
c100: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
c110: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
c120: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
c130: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
c140: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
c150: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
c160: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
c170: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
c180: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
c190: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
c1a0: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
c1b0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
c1c0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
c1d0: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
c1e0: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
c1f0: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
c200: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
c210: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c220: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
c230: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
c240: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
c250: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
c260: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
c270: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
c280: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
c290: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
c2a0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
c2b0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
c2c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
c2d0: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
c2e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
c2f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
c300: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
c310: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
c320: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
c330: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c340: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
c350: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
c360: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
c370: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
c380: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
c390: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
c3a0: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
c3b0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
c3c0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
c3d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
c3e0: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
c3f0: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
c400: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
c410: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
c420: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
c430: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
c440: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
c450: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
c460: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
c470: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
c480: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
c490: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
c4a0: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
c4b0: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
c4c0: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
c4d0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
c4e0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
c4f0: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
c500: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
c510: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
c520: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
c530: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
c540: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
c550: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c560: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
c570: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
c580: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c590: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
c5a0: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
c5b0: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
c5c0: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
c5d0: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
c5e0: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
c5f0: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
c600: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
c610: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
c620: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
c630: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
c640: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
c650: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
c660: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
c670: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
c680: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
c690: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
c6a0: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
c6b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
c6c0: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
c6d0: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
c6e0: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
c6f0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c700: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
c710: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
c720: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
c730: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
c740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
c750: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
c760: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
c770: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
c780: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
c790: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
c7a0: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
c7b0: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
c7c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c7d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
c7e0: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
c7f0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
c800: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
c810: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
c820: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
c830: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
c840: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
c850: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
c860: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c870: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
c880: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
c890: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
c8a0: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
c8b0: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
c8c0: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
c8d0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
c8e0: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
c8f0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
c900: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
c910: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
c920: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
c930: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
c940: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
c950: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
c960: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
c970: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
c980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c990: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c9a0: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
c9d0: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
c9e0: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
c9f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
ca00: 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  | HAVE_USLEEP.  
ca10: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
ca20: 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20  delays[] =.     
ca30: 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31  { 1, 2, 5, 10, 1
ca40: 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20  5, 20, 25, 25,  
ca50: 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30  25,  50,  50, 10
ca60: 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  0 };.  static co
ca70: 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20  nst u8 totals[] 
ca80: 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33  =.     { 0, 1, 3
ca90: 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33  ,  8, 18, 33, 53
caa0: 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20  , 78, 103, 128, 
cab0: 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65  178, 228 };.# de
cac0: 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61  fine NDELAY Arra
cad0: 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20  ySize(delays).  
cae0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
caf0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
cb00: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62  int timeout = db
cb10: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20  ->busyTimeout;. 
cb20: 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f   int delay, prio
cb30: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f  r;..  assert( co
cb40: 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unt>=0 );.  if( 
cb50: 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29  count < NDELAY )
cb60: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
cb70: 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20  lays[count];.   
cb80: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
cb90: 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  count];.  }else{
cba0: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
cbb0: 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20  ays[NDELAY-1];. 
cbc0: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
cbd0: 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65  s[NDELAY-1] + de
cbe0: 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c  lay*(count-(NDEL
cbf0: 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66  AY-1));.  }.  if
cc00: 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20  ( prior + delay 
cc10: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
cc20: 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74   delay = timeout
cc30: 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66   - prior;.    if
cc40: 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74  ( delay<=0 ) ret
cc50: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
cc60: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
cc70: 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30  pVfs, delay*1000
cc80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
cc90: 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a  else.  sqlite3 *
cca0: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
ccb0: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
ccc0: 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a  ut = ((sqlite3 *
ccd0: 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f  )ptr)->busyTimeo
cce0: 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74  ut;.  if( (count
ccf0: 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f  +1)*1000 > timeo
cd00: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
cd10: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
cd20: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
cd30: 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72  s, 1000000);.  r
cd40: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
cd50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
cd60: 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68  the given busy h
cd70: 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  andler..**.** Th
cd80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
cd90: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65  lled when an ope
cda0: 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69  ration failed wi
cdb0: 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66  th a lock..** If
cdc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
cdd0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
cde0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72  the lock is retr
cdf0: 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72  ied.  If it.** r
ce00: 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70  eturns 0, the op
ce10: 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77  eration aborts w
ce20: 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55  ith an SQLITE_BU
ce30: 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  SY error..*/.int
ce40: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
ce50: 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61  syHandler(BusyHa
ce60: 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ndler *p){.  int
ce70: 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   rc;.  if( NEVER
ce80: 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75  (p==0) || p->xFu
ce90: 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73  nc==0 || p->nBus
cea0: 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  y<0 ) return 0;.
ceb0: 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28    rc = p->xFunc(
cec0: 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73  p->pArg, p->nBus
ced0: 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  y);.  if( rc==0 
cee0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20  ){.    p->nBusy 
cef0: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
cf00: 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20     p->nBusy++;. 
cf10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
cf20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
cf30: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
cf40: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f  busy callback fo
cf50: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
cf60: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
cf70: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
cf80: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
cf90: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  given argument..
cfa0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
cfb0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  usy_handler(.  s
cfc0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
cfd0: 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a  t (*xBusy)(void*
cfe0: 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
cff0: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
d000: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
d010: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
d020: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
d030: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
d040: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d050: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
d060: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
d070: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
d080: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46  ->busyHandler.xF
d090: 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64  unc = xBusy;.  d
d0a0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70  b->busyHandler.p
d0b0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62  Arg = pArg;.  db
d0c0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
d0d0: 75 73 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62  usy = 0;.  db->b
d0e0: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  usyTimeout = 0;.
d0f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d100: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d110: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d120: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
d130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
d140: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
d150: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d160: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
d170: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
d180: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
d190: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
d1a0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
d1b0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
d1c0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
d1d0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
d1e0: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
d1f0: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
d200: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
d210: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
d220: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
d230: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
d240: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
d250: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
d260: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
d270: 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  rg.){.#ifdef SQL
d280: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
d290: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
d2a0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
d2b0: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
d2c0: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
d2d0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
d2e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
d2f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d300: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
d310: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
d320: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
d330: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
d340: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
d350: 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e  ps = (unsigned)n
d360: 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  Ops;.    db->pPr
d370: 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67  ogressArg = pArg
d380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
d390: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30  b->xProgress = 0
d3a0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
d3b0: 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20  essOps = 0;.    
d3c0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
d3d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
d3e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d3f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  db->mutex);.}.#e
d400: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
d410: 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c  s routine instal
d420: 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73  ls a default bus
d430: 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77  y handler that w
d440: 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  aits for the.** 
d450: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
d460: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
d470: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
d480: 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  g 0..*/.int sqli
d490: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
d4a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
d4b0: 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53 51  t ms){.#ifdef SQ
d4c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
d4d0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
d4e0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
d4f0: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
d500: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d510: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  T;.#endif.  if( 
d520: 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ms>0 ){.    sqli
d530: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
d540: 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75  (db, sqliteDefau
d550: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20  ltBusyCallback, 
d560: 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20  (void*)db);.    
d570: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
d580: 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = ms;.  }else{. 
d590: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
d5a0: 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30  handler(db, 0, 0
d5b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d5c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d5d0: 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65  .** Cause any pe
d5e0: 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  nding operation 
d5f0: 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65  to stop at its e
d600: 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e  arliest opportun
d610: 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
d620: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73  ite3_interrupt(s
d630: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
d640: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d650: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
d660: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
d670: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
d680: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
d690: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
d6a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
d6b0: 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49  dif.  db->u1.isI
d6c0: 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a  nterrupted = 1;.
d6d0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
d6e0: 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74  unction is exact
d6f0: 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  ly the same as s
d700: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
d710: 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74  nction(), except
d720: 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 64  .** that it is d
d730: 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61  esigned to be ca
d740: 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c  lled by internal
d750: 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65   code. The diffe
d760: 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74  rence is.** that
d770: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
d780: 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f  ails in sqlite3_
d790: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
d7a0: 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ), an error code
d7b0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
d7c0: 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61  and the mallocFa
d7d0: 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65  iled flag cleare
d7e0: 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  d. .*/.int sqlit
d7f0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20  e3CreateFunc(.  
d800: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
d810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
d820: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
d830: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
d840: 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61  .  void *pUserDa
d850: 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  ta,.  void (*xSF
d860: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
d870: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
d880: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
d890: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
d8a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
d8b0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
d8c0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
d8d0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
d8e0: 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44  ntext*),.  FuncD
d8f0: 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74  estructor *pDest
d900: 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63  ructor.){.  Func
d910: 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e  Def *p;.  int nN
d920: 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72 61  ame;.  int extra
d930: 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74  Flags;..  assert
d940: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d950: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
d960: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69  );.  if( zFuncti
d970: 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20  onName==0 ||.   
d980: 20 20 20 28 78 53 46 75 6e 63 20 26 26 20 28 78     (xSFunc && (x
d990: 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29  Final || xStep))
d9a0: 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 53 46   || .      (!xSF
d9b0: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
d9c0: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
d9d0: 20 20 20 20 28 21 78 53 46 75 6e 63 20 26 26 20      (!xSFunc && 
d9e0: 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65  (!xFinal && xSte
d9f0: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41  p)) ||.      (nA
da00: 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51  rg<-1 || nArg>SQ
da10: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
da20: 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20  N_ARG) ||.      
da30: 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71  (255<(nName = sq
da40: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a  lite3Strlen30( z
da50: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20  FunctionName))) 
da60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
da70: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
da80: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
da90: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
daa0: 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45  STANT==SQLITE_DE
dab0: 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20  TERMINISTIC );. 
dac0: 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e   extraFlags = en
dad0: 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45  c &  SQLITE_DETE
dae0: 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63  RMINISTIC;.  enc
daf0: 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43   &= (SQLITE_FUNC
db00: 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f  _ENCMASK|SQLITE_
db10: 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66  ANY);.  .#ifndef
db20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
db30: 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  16.  /* If SQLIT
db40: 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
db50: 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
db60: 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
db70: 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
db80: 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
db90: 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
dba0: 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
dbb0: 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
dbc0: 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
dbd0: 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
dbe0: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
dbf0: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  rnally..  **.  *
dc00: 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20  * If SQLITE_ANY 
dc10: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64  is specified, ad
dc20: 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73  d three versions
dc30: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
dc40: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73  .  ** to the has
dc50: 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  h table..  */.  
dc60: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
dc70: 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63  UTF16 ){.    enc
dc80: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
dc90: 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69  ATIVE;.  }else i
dca0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41  f( enc==SQLITE_A
dcb0: 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  NY ){.    int rc
dcc0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
dcd0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
dce0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
dcf0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
dd00: 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20  8|extraFlags,.  
dd10: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
dd20: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
dd30: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
dd40: 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ctor);.    if( r
dd50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
dd60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dd70: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
dd80: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
dd90: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
dda0: 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c  16LE|extraFlags,
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
ddc0: 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53  Data, xSFunc, xS
ddd0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
dde0: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
ddf0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
de00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
de10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
de20: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
de30: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23  E_UTF16BE;.  }.#
de40: 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c  else.  enc = SQL
de50: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66  ITE_UTF8;.#endif
de60: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
de70: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75  f an existing fu
de80: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
de90: 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65  overridden or de
dea0: 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20  leted. If so,.  
deb0: 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
dec0: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65   active VMs, the
ded0: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
dee0: 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74  BUSY. If a funct
def0: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ion.  ** is bein
df00: 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c  g overridden/del
df10: 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61  eted but there a
df20: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
df30: 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a  , allow the.  **
df40: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f   operation to co
df50: 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c  ntinue but inval
df60: 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d  idate all precom
df70: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
df80: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
df90: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
dfa0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
dfb0: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
dfc0: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  c, 0);.  if( p &
dfd0: 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  & (p->funcFlags 
dfe0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
dff0: 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70  CMASK)==enc && p
e000: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a  ->nArg==nArg ){.
e010: 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62      if( db->nVdb
e020: 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  eActive ){.     
e030: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
e040: 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
e050: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
e060: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
e070: 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e  /modify user-fun
e080: 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74  ction due to act
e090: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
e0a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e0b0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
e0c0: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
e0d0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
e0e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e0f0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
e100: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
e110: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
e120: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
e130: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
e140: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
e150: 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a  g, (u8)enc, 1);.
e160: 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62    assert(p || db
e170: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b  ->mallocFailed);
e180: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
e190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e1a0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
e1b0: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
e1c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
e1d0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
e1e0: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
e1f0: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
e200: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
e210: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
e220: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
e230: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
e240: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
e250: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
e260: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
e270: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
e280: 7d 0a 20 20 70 2d 3e 75 2e 70 44 65 73 74 72 75  }.  p->u.pDestru
e290: 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74  ctor = pDestruct
e2a0: 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61  or;.  p->funcFla
e2b0: 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61  gs = (p->funcFla
e2c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
e2d0: 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72  _ENCMASK) | extr
e2e0: 61 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61  aFlags;.  testca
e2f0: 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  se( p->funcFlags
e300: 20 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   & SQLITE_DETERM
e310: 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e  INISTIC );.  p->
e320: 78 53 46 75 6e 63 20 3d 20 78 53 46 75 6e 63 20  xSFunc = xSFunc 
e330: 3f 20 78 53 46 75 6e 63 20 3a 20 78 53 74 65 70  ? xSFunc : xStep
e340: 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65  ;.  p->xFinalize
e350: 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e   = xFinal;.  p->
e360: 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65  pUserData = pUse
e370: 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67  rData;.  p->nArg
e380: 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20   = (u16)nArg;.  
e390: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e3a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
e3b0: 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74  e new user funct
e3c0: 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
e3d0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e3e0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
e3f0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
e400: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
e410: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
e420: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
e430: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
e440: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
e450: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
e460: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
e470: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
e480: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e490: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
e4a0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
e4b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
e4c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
e4d0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e4e0: 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63  ion_v2(db, zFunc
e4f0: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
e500: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20  xSFunc, xStep,. 
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d     xFinal, 0);.}
e540: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  ..int sqlite3_cr
e550: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
e560: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
e570: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e580: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
e590: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
e5a0: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
e5b0: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
e5c0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e5d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e5e0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
e5f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e600: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e610: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e620: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
e630: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
e640: 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28  oid (*xDestroy)(
e650: 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74  void *).){.  int
e660: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e670: 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75  OR;.  FuncDestru
e680: 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a  ctor *pArg = 0;.
e690: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e6a0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e6b0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
e6c0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
e6d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e6e0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e6f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
e700: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e710: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
e720: 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b   if( xDestroy ){
e730: 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e  .    pArg = (Fun
e740: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71  cDestructor *)sq
e750: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
e760: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e  o(db, sizeof(Fun
e770: 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20  cDestructor));. 
e780: 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a     if( !pArg ){.
e790: 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70        xDestroy(p
e7a0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75  );.      goto ou
e7b0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  t;.    }.    pAr
e7c0: 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44  g->xDestroy = xD
e7d0: 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67  estroy;.    pArg
e7e0: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b  ->pUserData = p;
e7f0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
e800: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
e810: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
e820: 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78  nc, p, xSFunc, x
e830: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41  Step, xFinal, pA
e840: 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20  rg);.  if( pArg 
e850: 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30  && pArg->nRef==0
e860: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e870: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
e880: 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29  .    xDestroy(p)
e890: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e8a0: 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ree(db, pArg);. 
e8b0: 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d   }.. out:.  rc =
e8c0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e8d0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
e8e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e8f0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
e910: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
e920: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
e930: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e940: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
e950: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
e960: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
e970: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
e980: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
e990: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
e9a0: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
e9b0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e9c0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
e9d0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
e9e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e9f0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
ea00: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
ea10: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
ea20: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
ea30: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46  t rc;.  char *zF
ea40: 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  unc8;..#ifdef SQ
ea50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
ea60: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
ea70: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
ea80: 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69  k(db) || zFuncti
ea90: 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  onName==0 ) retu
eaa0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
eab0: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
eac0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ead0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
eae0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
eaf0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
eb00: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
eb10: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
eb20: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
eb30: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
eb40: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
eb50: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
eb60: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
eb70: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 53   eTextRep, p, xS
eb80: 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e 61  Func,xStep,xFina
eb90: 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  l,0);.  sqlite3D
eba0: 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38  bFree(db, zFunc8
ebb0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ebc0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
ebd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ebe0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ebf0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
ec00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
ec10: 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61  * Declare that a
ec20: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
ec30: 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  en overloaded by
ec40: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
ec50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
ec60: 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  unction already 
ec70: 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75  exists as a regu
ec80: 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  lar global funct
ec90: 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ion, then.** thi
eca0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
ecb0: 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75  o-op.  If the fu
ecc0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
ecd0: 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61  exist, then crea
ece0: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20  te.** a new one 
ecf0: 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f  that always thro
ed00: 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  ws a run-time er
ed10: 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  ror.  .**.** Whe
ed20: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
ed30: 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69   intend to provi
ed40: 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64  de an overloaded
ed50: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a   function, they.
ed60: 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74  ** should call t
ed70: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d  his routine to m
ed80: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f  ake sure the glo
ed90: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  bal function exi
eda0: 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  sts..** A global
edb0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65   function must e
edc0: 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  xist in order fo
edd0: 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
ede0: 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f  n to work.** pro
edf0: 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  perly..*/.int sq
ee00: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
ee10: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
ee20: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
ee30: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
ee40: 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74  nt nArg.){.  int
ee50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ee60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ee70: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
ee80: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
ee90: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
eea0: 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20   || zName==0 || 
eeb0: 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72  nArg<-2 ){.    r
eec0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
eed0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
eee0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
eef0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ef00: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
ef10: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
ef20: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
ef30: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
ef40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
ef50: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
ef60: 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  nc(db, zName, nA
ef70: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
ef80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
efa0: 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e  qlite3InvalidFun
efb0: 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  ction, 0, 0, 0);
efc0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
efd0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
efe0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
eff0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f000: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
f010: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
f020: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
f030: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
f040: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e   trace function.
f050: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
f060: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
f070: 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a  egistered trace.
f080: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
f090: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74   .**.** A NULL t
f0a0: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  race function me
f0b0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63  ans that no trac
f0c0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
f0d0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
f0e0: 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74  trace is a point
f0f0: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
f100: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
f110: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
f120: 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61   each.** SQL sta
f130: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
f140: 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73  *sqlite3_trace(s
f150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
f160: 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a   (*xTrace)(void*
f170: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76  ,const char*), v
f180: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f  oid *pArg){.  vo
f190: 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
f1a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f1b0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f1c0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f1d0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f1e0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
f1f0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
f200: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
f210: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f220: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f230: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
f240: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
f250: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
f260: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
f270: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
f280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f290: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f2a0: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
f2b0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
f2c0: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
f2d0: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
f2e0: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
f2f0: 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20   registered .** 
f300: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
f310: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
f320: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f  **.** A NULL pro
f330: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  file function me
f340: 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66  ans that no prof
f350: 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  iling is execute
f360: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
f370: 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70  * profile is a p
f380: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
f390: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
f3a0: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
f3b0: 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63  lusion of.** eac
f3c0: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
f3d0: 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  that is run..*/.
f3e0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
f3f0: 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  ofile(.  sqlite3
f400: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78   *db,.  void (*x
f410: 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63  Profile)(void*,c
f420: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
f430: 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e_uint64),.  voi
f440: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69  d *pArg.){.  voi
f450: 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
f460: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f470: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f480: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f490: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f4a0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
f4b0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
f4c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
f4d0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f4e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f4f0: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
f500: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20  ->pProfileArg;. 
f510: 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20   db->xProfile = 
f520: 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e  xProfile;.  db->
f530: 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41  pProfileArg = pA
f540: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
f550: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f560: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
f570: 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Old;.}.#endif /*
f580: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
f590: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  CE */../*.** Reg
f5a0: 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e  ister a function
f5b0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77   to be invoked w
f5c0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
f5d0: 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66  n commits..** If
f5e0: 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e   the invoked fun
f5f0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
f600: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
f610: 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20   commit becomes 
f620: 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  a.** rollback..*
f630: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
f640: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73  commit_hook(.  s
f650: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
f660: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
f670: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
f680: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
f690: 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
f6a0: 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46  k)(void*),  /* F
f6b0: 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b  unction to invok
f6c0: 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74  e on each commit
f6d0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
f700: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
f710: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
f720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f730: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
f740: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
f750: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
f760: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
f770: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
f780: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f790: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
f7a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f7b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
f7c0: 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
f7d0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
f7e0: 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
f7f0: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
f800: 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
f810: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f820: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
f830: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
f840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
f850: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
f860: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
f870: 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
f880: 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
f890: 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
f8a0: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
f8b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
f8c0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
f8d0: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  _update_hook(.  
f8e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
f8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
f900: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
f910: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
f920: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
f930: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
f940: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72  har const *,char
f950: 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f   const *,sqlite_
f960: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
f970: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
f980: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
f990: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
f9a0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
f9b0: 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  et;..#ifdef SQLI
f9c0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f9d0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f9e0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f9f0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
fa00: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
fa10: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
fa20: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
fa30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fa40: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
fa50: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
fa60: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
fa70: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
fa80: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
fa90: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
faa0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
fab0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
fac0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
fad0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
fae0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
faf0: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
fb00: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
fb10: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
fb20: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
fb30: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
fb40: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
fb50: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
fb60: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
fb70: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
fb80: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
fb90: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
fba0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
fbb0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
fbc0: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
fbd0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
fbe0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
fbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
fc00: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
fc10: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
fc20: 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64  oid *pRet;..#ifd
fc30: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
fc40: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
fc50: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
fc60: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
fc70: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
fc80: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
fc90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
fca0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
fcb0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
fcc0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
fcd0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
fce0: 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  ;.  db->xRollbac
fcf0: 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  kCallback = xCal
fd00: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f  lback;.  db->pRo
fd10: 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67  llbackArg = pArg
fd20: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
fd30: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
fd40: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
fd50: 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  t;.}..#ifdef SQL
fd60: 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
fd70: 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20  DATE_HOOK./*.** 
fd80: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
fd90: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
fda0: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
fdb0: 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
fdc0: 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
fdd0: 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
fde0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
fdf0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
fe00: 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
fe10: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
fe20: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
fe30: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
fe40: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
fe50: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28  abase */.  void(
fe60: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20  *xCallback)(    
fe70: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b       /* Callback
fe80: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
fe90: 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c   void*,sqlite3*,
fea0: 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c  int,char const*,
feb0: 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69  char const*,sqli
fec0: 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65  te3_int64,sqlite
fed0: 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  3_int64),.  void
fee0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
fef0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
ff00: 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
ff10: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
ff20: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
ff30: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ff40: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
ff50: 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
ff60: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64  g;.  db->xPreUpd
ff70: 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ateCallback = xC
ff80: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
ff90: 50 72 65 55 70 64 61 74 65 41 72 67 20 3d 20 70  PreUpdateArg = p
ffa0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
ffb0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ffc0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ffd0: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
ffe0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
fff0: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
10000 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
10010 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
10020 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
10030 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
10040 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
10050 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
10060 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
10070 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
10080 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
10090 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
100a0 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
100b0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
100c0 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
100d0 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
100e0 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
100f0 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
10100 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
10110 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
10120 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
10130 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
10140 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
10150 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
10160 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
10170 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
10180 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
10190 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
101a0 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
101b0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
101c0 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
101d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
101e0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
101f0 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
10200 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
10210 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
10220 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
10230 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
10240 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
10250 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
10260 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
10270 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
10280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10290 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
102a0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
102b0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
102c0 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
102d0 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
102e0 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
102f0 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
10300 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
10310 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
10320 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
10330 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
10340 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
10350 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
10360 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
10370 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
10380 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
10390 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
103a0 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
103b0 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
103c0 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
103d0 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
103e0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
103f0 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
10400 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
10410 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
10420 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
10430 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
10440 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
10450 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
10460 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
10470 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
10480 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
10490 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
104a0 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
104b0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
104c0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
104d0 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
104e0 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
104f0 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
10500 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
10510 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
10520 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
10530 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10540 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
10550 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10560 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
10570 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
10580 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
10590 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
105a0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
105b0 64 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  dif.  if( nFrame
105c0 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
105d0 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73  3_wal_hook(db, s
105e0 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
105f0 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54  Hook, SQLITE_INT
10600 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29  _TO_PTR(nFrame))
10610 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
10620 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
10630 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23  db, 0, 0);.  }.#
10640 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
10650 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10660 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
10670 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
10680 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
10690 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
106a0 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
106b0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d  the write-ahead-
106c0 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61  log by this data
106d0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
106e0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
106f0 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71  3_wal_hook(.  sq
10700 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10720 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
10730 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64   to this db hand
10740 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61  le */.  int(*xCa
10750 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20  llback)(void *, 
10760 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20  sqlite3*, const 
10770 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76  char*, int),.  v
10780 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
107a0 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
107b0 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c   passed to xCall
107c0 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66  back() */.){.#if
107d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
107e0 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65  _WAL.  void *pRe
107f0 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
10800 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10810 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10820 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
10830 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
10840 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10850 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
10860 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
10870 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10880 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10890 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41  pRet = db->pWalA
108a0 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61  rg;.  db->xWalCa
108b0 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
108c0 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72  ck;.  db->pWalAr
108d0 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
108e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
108f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10900 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65  turn pRet;.#else
10910 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
10920 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  dif.}../*.** Che
10930 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
10940 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   zDb..*/.int sql
10950 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10960 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  int_v2(.  sqlite
10970 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10990 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
109a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
109b0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
109c0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74    /* Name of att
109d0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28  ached database (
109e0 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
109f0 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20  t eMode,        
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a10 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
10a20 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NT_* value */.  
10a30 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20  int *pnLog,     
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a50 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
10a60 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65  WAL log in frame
10a70 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b  s */.  int *pnCk
10a80 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pt              
10a90 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
10aa0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66  otal number of f
10ab0 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74  rames checkpoint
10ac0 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  ed */.){.#ifdef 
10ad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
10ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10af0 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  OK;.#else.  int 
10b00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10b20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
10b30 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45  int iDb = SQLITE
10b40 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20  _MAX_ATTACHED;  
10b50 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  /* sqlite3.aDb[]
10b60 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20   index of db to 
10b70 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23  checkpoint */..#
10b80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10b90 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10ba0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10bb0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
10bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
10bd0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
10be0 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  f..  /* Initiali
10bf0 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
10c00 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
10c10 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
10c20 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
10c30 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
10c40 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
10c50 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
10c60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
10c70 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
10c80 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61  ASSIVE==0 );.  a
10c90 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
10ca0 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31  ECKPOINT_FULL==1
10cb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
10cc0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
10cd0 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20  RESTART==2 );.  
10ce0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
10cf0 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
10d00 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65  TE==3 );.  if( e
10d10 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43  Mode<SQLITE_CHEC
10d20 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c  KPOINT_PASSIVE |
10d30 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43  | eMode>SQLITE_C
10d40 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
10d50 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TE ){.    /* EVI
10d60 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39  DENCE-OF: R-0399
10d70 36 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70 61  6-12088 The M pa
10d80 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
10d90 61 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69  a valid checkpoi
10da0 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20  nt.    ** mode: 
10db0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
10dc0 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
10dd0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
10de0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
10df0 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26  x);.  if( zDb &&
10e00 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69   zDb[0] ){.    i
10e10 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
10e20 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
10e30 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30  .  }.  if( iDb<0
10e40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10e50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
10e60 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
10e70 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  sg(db, SQLITE_ER
10e80 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  ROR, "unknown da
10e90 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62  tabase: %s", zDb
10ea0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10eb0 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
10ec0 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 72  nBusy = 0;.    r
10ed0 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b  c = sqlite3Check
10ee0 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65  point(db, iDb, e
10ef0 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
10f00 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  kpt);.    sqlite
10f10 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
10f20 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
10f30 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
10f40 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
10f50 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
10f60 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
10f70 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
10f80 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
10f90 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a  tabase zDb. If z
10fa0 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69  Db is NULL, or i
10fb0 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 44 62  f the buffer zDb
10fc0 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f   points.** to co
10fd0 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65  ntains a zero-le
10fe0 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c  ngth string, all
10ff0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
11000 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63  ses are .** chec
11010 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74  kpointed..*/.int
11020 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
11030 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
11040 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
11050 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44  *zDb){.  /* EVID
11060 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33  ENCE-OF: R-41613
11070 2d 32 30 35 35 33 20 54 68 65 20 73 71 6c 69 74  -20553 The sqlit
11080 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
11090 74 28 44 2c 58 29 20 69 73 20 65 71 75 69 76 61  t(D,X) is equiva
110a0 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c  lent to.  ** sql
110b0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
110c0 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54  int_v2(D,X,SQLIT
110d0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
110e0 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20  SIVE,0,0). */.  
110f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77  return sqlite3_w
11100 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
11110 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43  (db,zDb,SQLITE_C
11120 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
11130 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64  E,0,0);.}..#ifnd
11140 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
11150 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63  AL./*.** Run a c
11160 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74  heckpoint on dat
11170 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20  abase iDb. This 
11180 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61  is a no-op if da
11190 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a  tabase iDb is.**
111a0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f   not currently o
111b0 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  pen in WAL mode.
111c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
111d0 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
111e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
111f0 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
11200 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ed, this .** fun
11210 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
11220 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  LITE_LOCKED and 
11230 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  a checkpoint is 
11240 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49  not attempted. I
11250 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  f .** an error o
11260 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e  ccurs while runn
11270 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ing the checkpoi
11280 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  nt, an SQLite er
11290 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
112a0 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53  returned (i.e. S
112b0 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74  QLITE_IOERR). Ot
112c0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
112d0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  OK..**.** The mu
112e0 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
112f0 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64  handle db should
11300 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20   be held by the 
11310 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65  caller. The mute
11320 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  x.** associated 
11330 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
11340 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63  c b-tree being c
11350 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74  heckpointed is t
11360 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20  aken by.** this 
11370 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74  function while t
11380 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73  he checkpoint is
11390 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   running..**.** 
113a0 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64  If iDb is passed
113b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
113c0 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61  CHED, then all a
113d0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
113e0 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f  s are.** checkpo
113f0 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72  inted. If an err
11400 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
11410 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  d it is returned
11420 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a   immediately -.*
11430 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20  * no attempt is 
11440 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69  made to checkpoi
11450 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67  nt any remaining
11460 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
11470 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  * Parameter eMod
11480 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49  e is one of SQLI
11490 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
114a0 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52  SSIVE, FULL or R
114b0 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73  ESTART..*/.int s
114c0 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
114d0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
114e0 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65  t iDb, int eMode
114f0 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e  , int *pnLog, in
11500 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e  t *pnCkpt){.  in
11510 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11530 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
11540 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11560 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
11570 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74  rate through att
11580 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69  ached dbs */.  i
11590 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20  nt bBusy = 0;   
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
115b0 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45  * True if SQLITE
115c0 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65  _BUSY has been e
115d0 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20  ncountered */.. 
115e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
115f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
11600 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11610 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70  rt( !pnLog || *p
11620 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73  nLog==-1 );.  as
11630 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c  sert( !pnCkpt ||
11640 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a   *pnCkpt==-1 );.
11650 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
11660 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c  ->nDb && rc==SQL
11670 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
11680 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20    if( i==iDb || 
11690 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  iDb==SQLITE_MAX_
116a0 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20  ATTACHED ){.    
116b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
116c0 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  reeCheckpoint(db
116d0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d  ->aDb[i].pBt, eM
116e0 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
116f0 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67  pt);.      pnLog
11700 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b   = 0;.      pnCk
11710 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  pt = 0;.      if
11720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
11730 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75  Y ){.        bBu
11740 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sy = 1;.        
11750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11760 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11770 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
11780 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42  =SQLITE_OK && bB
11790 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55  usy) ? SQLITE_BU
117a0 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  SY : rc;.}.#endi
117b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
117c0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  _WAL */../*.** T
117d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
117e0 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69  urns true if mai
117f0 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20  n-memory should 
11800 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
11810 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  of.** a temporar
11820 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73  y file for trans
11830 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73  ient pager files
11840 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a   and statement j
11850 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20  ournals..** The 
11860 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64  value returned d
11870 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
11880 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f  lue of db->temp_
11890 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a  store (runtime.*
118a0 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64  * parameter) and
118b0 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d   the compile tim
118c0 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
118d0 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68  E_TEMP_STORE. Th
118e0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  e.** following t
118f0 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
11900 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
11910 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77  between these tw
11920 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20  o values.** and 
11930 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72  this functions r
11940 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  eturn value..**.
11950 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50  **   SQLITE_TEMP
11960 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74  _STORE     db->t
11970 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f  emp_store     Lo
11980 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72  cation of tempor
11990 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
119a0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
119b0 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
119c0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
119d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
11a10 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
11a20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
11a30 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
11a40 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
11a50 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
11a60 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
11a70 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
11a80 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
11aa0 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
11ab0 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  1).**   1       
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ae0 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
11af0 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
11b20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
11b30 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
11b60 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
11b70 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
11b80 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
11b90 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
11ba0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
11bb0 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
11bc0 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20  *   3           
11bd0 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
11bf0 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
11c00 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
11c10 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e  TempInMemory(con
11c20 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  st sqlite3 *db){
11c30 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
11c40 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75  _STORE==1.  retu
11c50 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
11c60 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ore==2 );.#endif
11c70 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
11c80 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75  _STORE==2.  retu
11c90 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
11ca0 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66  ore!=1 );.#endif
11cb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
11cc0 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53  _STORE==3.  UNUS
11cd0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
11ce0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
11cf0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
11d00 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20  TEMP_STORE<1 || 
11d10 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
11d20 45 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E>3.  UNUSED_PAR
11d30 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
11d40 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
11d50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  ../*.** Return U
11d60 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67  TF-8 encoded Eng
11d70 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
11d80 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
11d90 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
11da0 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
11db0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
11dc0 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62  rmsg(sqlite3 *db
11dd0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
11de0 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
11df0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
11e00 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
11e10 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
11e20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
11e30 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
11e40 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
11e50 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
11e60 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
11e70 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73  E_BKPT);.  }.  s
11e80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
11e90 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
11ea0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11eb0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
11ec0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
11ed0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11ee0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11ef0 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45  testcase( db->pE
11f00 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d  rr==0 );.    z =
11f10 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
11f20 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
11f30 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
11f40 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
11f50 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
11f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
11f70 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
11f80 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
11f90 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
11fa0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11fb0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11fc0 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
11fd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
11fe0 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
11ff0 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
12000 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
12010 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
12020 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
12030 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
12040 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
12050 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
12060 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
12070 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
12080 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
12090 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
120a0 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
120b0 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
120c0 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
120d0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
120e0 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
120f0 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27  = {.    'l', 'i'
12100 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'b', 'r', 'a',
12110 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20   'r', 'y', ' ', 
12120 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27  .    'r', 'o', '
12130 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e  u', 't', 'i', 'n
12140 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'e', ' ', .  
12150 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c    'c', 'a', 'l',
12160 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20   'l', 'e', 'd', 
12170 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
12180 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20  u', 't', ' ', . 
12190 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27     'o', 'f', ' '
121a0 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c  , .    's', 'e',
121b0 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20   'q', 'u', 'e', 
121c0 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30  'n', 'c', 'e', 0
121d0 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
121e0 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
121f0 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
12200 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
12210 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
12220 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
12230 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
12240 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
12250 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
12260 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12270 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
12280 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12290 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
122a0 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
122b0 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
122c0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
122d0 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
122e0 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
122f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12300 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
12310 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20  b, db->errCode, 
12320 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
12330 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20  ->errCode));.   
12340 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
12350 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
12360 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
12370 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
12380 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
12390 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
123a0 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
123b0 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
123c0 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
123d0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
123e0 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
123f0 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
12400 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
12410 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
12420 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
12430 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
12440 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
12450 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
12460 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
12470 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
12480 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
12490 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
124a0 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72   sqlite3OomClear
124b0 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
124c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
124d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
124e0 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
124f0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12500 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
12510 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
12520 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
12530 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
12540 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
12550 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
12560 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
12570 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
12580 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
12590 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
125a0 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
125b0 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
125c0 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
125d0 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
125e0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
125f0 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
12600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12610 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
12620 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
12630 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12640 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12650 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12660 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
12670 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
12680 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
12690 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
126a0 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
126b0 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
126c0 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
126d0 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
126e0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
126f0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
12700 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
12710 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
12720 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
12730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12740 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
12750 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
12760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
12770 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
12780 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
12790 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
127a0 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
127b0 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e  argument.  For n
127c0 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20  ow, this simply 
127d0 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e  calls the intern
127e0 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  al sqlite3ErrStr
127f0 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ().** function..
12800 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
12810 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e  qlite3_errstr(in
12820 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20  t rc){.  return 
12830 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
12840 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
12850 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  te a new collati
12860 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
12870 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20  database "db".  
12880 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d  The name is zNam
12890 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63  e.** and the enc
128a0 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f  oding is enc..*/
128b0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
128c0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  teCollation(.  s
128d0 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f  qlite3* db,.  co
128e0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
128f0 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f   .  u8 enc,.  vo
12900 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
12910 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
12920 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
12930 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
12940 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
12950 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c  (void*).){.  Col
12960 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
12970 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73  nt enc2;.  .  as
12980 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12990 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
129a0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
129b0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
129c0 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
129d0 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
129e0 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
129f0 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
12a00 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
12a10 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
12a20 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
12a30 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
12a40 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
12a50 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
12a60 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
12a70 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a  /.  enc2 = enc;.
12a80 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
12a90 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
12aa0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
12ab0 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
12ac0 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66  _ALIGNED );.  if
12ad0 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
12ae0 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51  TF16 || enc2==SQ
12af0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
12b00 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d  ED ){.    enc2 =
12b10 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
12b20 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  IVE;.  }.  if( e
12b30 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20  nc2<SQLITE_UTF8 
12b40 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55  || enc2>SQLITE_U
12b50 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65  TF16BE ){.    re
12b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
12b70 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
12b80 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
12b90 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
12ba0 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
12bb0 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
12bc0 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
12bd0 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
12be0 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
12bf0 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
12c00 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
12c10 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
12c20 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
12c30 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
12c40 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
12c50 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
12c60 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
12c70 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
12c80 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 0);.  if( pCo
12c90 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
12ca0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  p ){.    if( db-
12cb0 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
12cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12cd0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
12ce0 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
12cf0 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
12d00 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c  elete/modify col
12d10 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12d20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
12d30 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
12d40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12d50 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
12d60 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
12d70 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
12d80 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  db);..    /* If 
12d90 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
12da0 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65  ce pColl was cre
12db0 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  ated directly by
12dc0 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a   a call to.    *
12dd0 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
12de0 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20  _collation, and 
12df0 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  not generated by
12e00 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c   synthCollSeq(),
12e10 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79  .    ** then any
12e20 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20   copies made by 
12e30 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e  synthCollSeq() n
12e40 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  eed to be invali
12e50 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  dated..    ** Al
12e60 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65  so, collation de
12e70 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53  structor - CollS
12e80 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63  eq.xDel() - func
12e90 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20  tion may need.  
12ea0 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65    ** to be calle
12eb0 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69  d..    */ .    i
12ec0 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26  f( (pColl->enc &
12ed0 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
12ee0 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b  LIGNED)==enc2 ){
12ef0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
12f00 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  aColl = sqlite3H
12f10 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
12f20 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20  llSeq, zName);. 
12f30 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
12f40 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
12f50 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
12f60 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
12f70 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
12f80 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
12f90 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
12fa0 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
12fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
12fc0 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
12fd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12fe0 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
12ff0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
13000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
13010 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13020 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13030 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
13040 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
13050 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
13060 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
13070 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
13080 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f   xCompare;.  pCo
13090 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
130a0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20  ;.  pColl->xDel 
130b0 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d  = xDel;.  pColl-
130c0 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
130d0 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
130e0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
130f0 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
13100 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
13110 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13120 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
13130 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
13140 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
13150 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
13160 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
13170 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
13180 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
13190 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
131a0 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
131b0 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
131c0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
131d0 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
131e0 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
131f0 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
13200 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
13210 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
13220 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
13230 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
13240 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
13250 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
13260 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
13270 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
13280 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
13290 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
132a0 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
132b0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
132c0 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
132d0 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
132e0 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49  UMBER,      /* I
132f0 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35  MP: R-38091-3235
13300 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41  2 */.  SQLITE_MA
13310 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
13320 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  .  SQLITE_MAX_WO
13330 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b  RKER_THREADS,.};
13340 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
13350 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  e the hard limit
13360 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61  s are set to rea
13370 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a  sonable values.*
13380 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
13390 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
133a0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
133b0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
133c0 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
133d0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
133e0 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _SQL_LENGTH<100.
133f0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13400 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
13410 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
13420 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
13430 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
13440 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  GTH>SQLITE_MAX_L
13450 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51  ENGTH.# error SQ
13460 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
13470 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  GTH must not be 
13480 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
13490 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
134a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
134b0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
134c0 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53  LECT<2.# error S
134d0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
134e0 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  ND_SELECT must b
134f0 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e  e at least 2.#en
13500 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13510 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20  AX_VDBE_OP<40.# 
13520 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13530 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65  _VDBE_OP must be
13540 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e   at least 40.#en
13550 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13560 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c  AX_FUNCTION_ARG<
13570 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
13580 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37  FUNCTION_ARG>127
13590 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
135a0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
135b0 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
135c0 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69   0 and 127.#endi
135d0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
135e0 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
135f0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13600 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53  ED>125.# error S
13610 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13620 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
13630 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e  en 0 and 125.#en
13640 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13650 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
13660 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72  LENGTH<1.# error
13670 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
13680 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
13690 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
136a0 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
136b0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
136c0 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
136d0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
136e0 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
136f0 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66  32767.#endif.#if
13700 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
13710 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72  GER_DEPTH<1.# er
13720 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ror SQLITE_MAX_T
13730 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73  RIGGER_DEPTH mus
13740 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
13750 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13760 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13770 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45  EADS<0 || SQLITE
13780 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13790 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53  ADS>50.# error S
137a0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
137b0 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65  _THREADS must be
137c0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35   between 0 and 5
137d0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
137e0 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
137f0 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
13800 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
13810 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
13820 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
13830 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
13840 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
13850 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
13860 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
13870 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
13880 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
13890 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
138a0 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
138b0 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
138c0 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
138d0 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
138e0 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
138f0 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
13900 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
13910 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
13920 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
13930 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
13940 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
13950 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
13960 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
13970 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  it;..#ifdef SQLI
13980 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
13990 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
139a0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
139b0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
139c0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
139d0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
139e0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
139f0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
13a00 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
13a10 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
13a20 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
13a30 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
13a40 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
13a50 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
13a60 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
13a70 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
13a80 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
13a90 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
13aa0 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
13ab0 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
13ac0 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
13ad0 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
13ae0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
13af0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13b00 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
13b10 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
13b20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13b30 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13b40 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
13b50 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
13b60 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
13b70 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
13b80 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
13b90 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
13ba0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
13bb0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
13bc0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
13bd0 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
13be0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
13bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13c00 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13c10 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
13c20 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
13c30 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
13c40 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
13c50 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13c60 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
13c70 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
13c80 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
13c90 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13ca0 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
13cb0 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
13cc0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
13cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13ce0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
13cf0 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
13d00 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13d10 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
13d20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13d30 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
13d40 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
13d80 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
13d90 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
13da0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
13db0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
13dc0 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
13dd0 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
13de0 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
13df0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13e00 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13e10 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
13e20 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
13e30 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
13e40 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13e50 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13e60 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
13e70 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ==SQLITE_MAX_WOR
13e80 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20  KER_THREADS );. 
13e90 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
13ea0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
13eb0 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EADS==(SQLITE_N_
13ec0 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
13ed0 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
13ee0 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
13ef0 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
13f00 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
13f10 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
13f20 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
13f30 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
13f40 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
13f50 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
13f60 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
13f70 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
13f80 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
13f90 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
13fa0 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
13fb0 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
13fc0 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
13fd0 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
13fe0 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
13ff0 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
14000 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
14010 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14030 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
14040 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
14050 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
14060 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
14070 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
14080 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
14090 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
140a0 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
140b0 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
140c0 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
140d0 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
140e0 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
140f0 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
14100 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
14110 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
14120 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
14130 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
14140 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
14150 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
14160 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
14170 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
14180 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
14190 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
141a0 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
141b0 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
141c0 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
141d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
141e0 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
141f0 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
14200 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
14210 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
14220 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
14230 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
14240 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
14250 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
14260 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
14270 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
14280 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
14290 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
142a0 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
142b0 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
142c0 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
142d0 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
142e0 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
142f0 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
14300 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
14310 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
14320 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
14330 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
14340 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
14350 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
14360 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
14370 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
14380 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
14390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
143a0 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
143b0 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
143c0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
143d0 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
143e0 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
143f0 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
14400 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14410 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
14420 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
14430 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
14440 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
14450 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
14460 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14470 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
14480 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
14490 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
144a0 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
144b0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
144c0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
144d0 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
144e0 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
144f0 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
14500 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
14510 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
14520 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
14530 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
14540 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
14550 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
14560 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
14570 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
14580 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
14590 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
145a0 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
145b0 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
145c0 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
145d0 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
145f0 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
14600 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
14610 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
14620 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
14630 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
14640 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
14650 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
14660 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
14670 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
14680 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
14690 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
146c0 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
146d0 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
146e0 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
146f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
14700 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
14710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
14720 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
14730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
14740 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
14750 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
14760 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
14770 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
14780 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
14790 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
147a0 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
147b0 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
147c0 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
147d0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
147e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
147f0 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20  EN_URI)         
14800 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38      /* IMP: R-48
14810 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20  725-32206 */.   
14820 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
14830 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
14840 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50  bOpenUri) /* IMP
14850 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20  : R-51689-46548 
14860 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  */.   && nUri>=5
14870 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
14880 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
14890 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d  /* IMP: R-57884-
148a0 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20  37496 */.  ){.  
148b0 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
148c0 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
148f0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
14900 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
14930 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
14940 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
14950 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14960 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
14970 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
14980 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d  .    u64 nByte =
14990 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
149a0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
149b0 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
149c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
149d0 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
149e0 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
149f0 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
14a00 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
14a10 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
14a20 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
14a30 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
14a40 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
14a50 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
14a60 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
14a70 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
14a80 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
14a90 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
14aa0 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
14ab0 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
14ac0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
14ad0 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
14ae0 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
14af0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14b00 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20  NOMEM_BKPT;..   
14b10 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66   iIn = 5;.#ifdef
14b20 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52   SQLITE_ALLOW_UR
14b30 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20  I_AUTHORITY.    
14b40 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
14b50 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30  +5, "///", 3)==0
14b60 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
14b70 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  7;.      /* The 
14b80 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74  following condit
14b90 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20  ion causes URIs 
14ba0 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e  with five leadin
14bb0 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
14bc0 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c       ** like fil
14bd0 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68  e://///host/path
14be0 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64   to be converted
14bf0 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20   into UNCs like 
14c00 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20  //host/path..   
14c10 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63     ** The correc
14c20 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55  t URI for that U
14c30 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20  NC has only two 
14c40 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20  or four leading 
14c50 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
14c60 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73     ** file://hos
14c70 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f  t/path or file:/
14c80 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42  ///host/path.  B
14c90 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61  ut 5 leading sla
14ca0 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20  shes is a .     
14cb0 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72   ** common error
14cc0 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73  , we are told, s
14cd0 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61  o we handle it a
14ce0 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
14cf0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
14d00 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22  trncmp(zUri+7, "
14d10 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69  ///", 3)==0 ){ i
14d20 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73  In++; }.    }els
14d30 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55  e if( strncmp(zU
14d40 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f  ri+5, "//localho
14d50 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a  st/", 12)==0 ){.
14d60 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a        iIn = 16;.
14d70 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
14d80 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73  /* Discard the s
14d90 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72  cheme and author
14da0 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  ity segments of 
14db0 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20  the URI. */.    
14dc0 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27  if( zUri[5]=='/'
14dd0 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27   && zUri[6]=='/'
14de0 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
14df0 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  7;.      while( 
14e00 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
14e10 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49  i[iIn]!='/' ) iI
14e20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  n++;.      if( i
14e30 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31  In!=7 && (iIn!=1
14e40 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63  6 || memcmp("loc
14e50 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37  alhost", &zUri[7
14e60 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20  ], 9)) ){.      
14e70 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
14e80 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
14e90 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
14ea0 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20  rity: %.*s", .  
14eb0 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c            iIn-7,
14ec0 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20   &zUri[7]);.    
14ed0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14ee0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
14ef0 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
14f00 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
14f10 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
14f20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d  Copy the filenam
14f30 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20  e and any query 
14f40 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20  parameters into 
14f50 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72  the zFile buffer
14f60 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65  . .    ** Decode
14f70 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65   %HH escape code
14f80 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  s along the way.
14f90 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
14fa0 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  Within this loop
14fb0 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74  , variable eStat
14fc0 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
14fd0 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e  0, 1 or 2, depen
14fe0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ding.    ** on t
14ff0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
15000 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  xt. As follows:.
15010 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
15020 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d  0: Parsing file-
15030 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31  name..    **   1
15040 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73  : Parsing name s
15050 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
15060 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
15070 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20  ameter..    **  
15080 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75   2: Parsing valu
15090 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
150a0 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
150b0 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
150c0 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30  /.    eState = 0
150d0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20  ;.    while( (c 
150e0 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
150f0 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20  && c!='#' ){.   
15100 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
15110 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20  if( c=='%' .    
15120 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
15130 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29  digit(zUri[iIn])
15140 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
15150 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
15160 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20  [iIn+1]) .      
15170 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
15180 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48  ctet = (sqlite3H
15190 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
151a0 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20  ++]) << 4);.    
151b0 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c      octet += sql
151c0 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
151d0 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20  i[iIn++]);..    
151e0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65      assert( octe
151f0 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35  t>=0 && octet<25
15200 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
15210 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20   octet==0 ){.   
15220 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
15230 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
15240 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72  hen "%00" appear
15250 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49  s within the URI
15260 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20  . In this.      
15270 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69      ** case we i
15280 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69  gnore all text i
15290 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  n the remainder 
152a0 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d  of the path, nam
152b0 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  e or.          *
152c0 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c  * value currentl
152d0 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20  y being parsed. 
152e0 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75  So ignore the cu
152f0 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a  rrent character.
15300 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
15310 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78   skip to the nex
15320 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26  t "?", "=" or "&
15330 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ", as appropriat
15340 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
15350 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
15360 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
15370 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '#' .           
15380 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30     && (eState!=0
15390 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20   || c!='?').    
153a0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
153b0 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27  tate!=1 || (c!='
153c0 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20  =' && c!='&')). 
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
153e0 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21  (eState!=2 || c!
153f0 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='&').          
15400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
15410 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
15420 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
15430 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
15440 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65          c = octe
15450 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
15460 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20  f( eState==1 && 
15470 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d  (c=='&' || c=='=
15480 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ') ){.        if
15490 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d  ( zFile[iOut-1]=
154a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
154b0 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69  /* An empty opti
154c0 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20  on name. Ignore 
154d0 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f  this option alto
154e0 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gether. */.     
154f0 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69       while( zUri
15500 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49  [iIn] && zUri[iI
15510 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b  n]!='#' && zUri[
15520 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49  iIn-1]!='&' ) iI
15530 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  n++;.          c
15540 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
15550 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
15560 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20  =='&' ){.       
15570 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
15580 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
15590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
155a0 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20    eState = 2;.  
155b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
155c0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 0;.      }el
155d0 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d  se if( (eState==
155e0 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20  0 && c=='?') || 
155f0 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d  (eState==2 && c=
15600 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='&') ){.       
15610 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
15620 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  eState = 1;.    
15630 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b    }.      zFile[
15640 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  iOut++] = c;.   
15650 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74   }.    if( eStat
15660 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75  e==1 ) zFile[iOu
15670 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
15680 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
15690 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
156a0 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
156b0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
156c0 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79  f there were any
156d0 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69   options specifi
156e0 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ed that should b
156f0 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20  e interpreted . 
15700 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69     ** here. Opti
15710 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74  ons that are int
15720 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e  erpreted here in
15730 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20  clude "vfs" and 
15740 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a  those that.    *
15750 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  * correspond to 
15760 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62  flags that may b
15770 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
15780 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
15790 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e  ).    ** method.
157a0 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26   */.    zOpt = &
157b0 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72  zFile[sqlite3Str
157c0 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b  len30(zFile)+1];
157d0 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74  .    while( zOpt
157e0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
157f0 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53   nOpt = sqlite3S
15800 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20  trlen30(zOpt);. 
15810 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20       char *zVal 
15820 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b  = &zOpt[nOpt+1];
15830 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20  .      int nVal 
15840 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15850 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20  0(zVal);..      
15860 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d  if( nOpt==3 && m
15870 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70  emcmp("vfs", zOp
15880 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 3)==0 ){.    
15890 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b      zVfs = zVal;
158a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
158b0 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65        struct Ope
158c0 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20  nMode {.        
158d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
158e0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
158f0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a  ode;.        } *
15900 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  aMode = 0;.     
15910 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79     char *zModeTy
15920 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pe = 0;.        
15930 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  int mask = 0;.  
15940 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20        int limit 
15950 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  = 0;..        if
15960 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d  ( nOpt==5 && mem
15970 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70  cmp("cache", zOp
15980 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 5)==0 ){.    
15990 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
159a0 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61  uct OpenMode aCa
159b0 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  cheMode[] = {.  
159c0 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61            { "sha
159d0 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  red",  SQLITE_OP
159e0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d  EN_SHAREDCACHE }
159f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
15a00 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54  "private", SQLIT
15a10 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
15a20 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
15a30 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
15a40 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
15a50 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
15a60 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
15a70 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  HE|SQLITE_OPEN_P
15a80 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20  RIVATECACHE;.   
15a90 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
15aa0 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20  CacheMode;.     
15ab0 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73       limit = mas
15ac0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  k;.          zMo
15ad0 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22  deType = "cache"
15ae0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15af0 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20      if( nOpt==4 
15b00 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22  && memcmp("mode"
15b10 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b  , zOpt, 4)==0 ){
15b20 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
15b30 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
15b40 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20  e aOpenMode[] = 
15b50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
15b60 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  "ro",  SQLITE_OP
15b70 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20  EN_READONLY },. 
15b80 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
15b90 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
15ba0 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20  READWRITE }, .  
15bb0 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63            { "rwc
15bc0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ", SQLITE_OPEN_R
15bd0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
15be0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c  E_OPEN_CREATE },
15bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
15c00 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f  memory", SQLITE_
15c10 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20  OPEN_MEMORY },. 
15c20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
15c30 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
15c40 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
15c50 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
15c60 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45  EADONLY | SQLITE
15c70 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
15ca0 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
15cb0 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20  _OPEN_MEMORY;.  
15cc0 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
15cd0 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20  aOpenMode;.     
15ce0 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73       limit = mas
15cf0 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  k & flags;.     
15d00 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
15d10 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20   "access";.     
15d20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
15d30 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( aMode ){.     
15d40 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
15d50 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d        int mode =
15d60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
15d70 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e  r(i=0; aMode[i].
15d80 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; i++){.       
15d90 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
15da0 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  *z = aMode[i].z;
15db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
15dc0 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74   nVal==sqlite3St
15dd0 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d  rlen30(z) && 0==
15de0 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20  memcmp(zVal, z, 
15df0 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  nVal) ){.       
15e00 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d         mode = aM
15e10 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20  ode[i].mode;.   
15e20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
15e40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15e50 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d        if( mode==
15e60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
15e70 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
15e80 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
15e90 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25   such %s mode: %
15ea0 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a  s", zModeType, z
15eb0 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
15ec0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15ed0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
15ee0 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
15ef0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
15f00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
15f10 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f  mode & ~SQLITE_O
15f20 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69  PEN_MEMORY)>limi
15f30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
15f40 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
15f50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
15f60 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65   mode not allowe
15f70 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  d: %s",.        
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fa0 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29  zModeType, zVal)
15fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
15fc0 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a   = SQLITE_PERM;.
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
15fe0 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
15ff0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16000 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66        flags = (f
16010 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20  lags & ~mask) | 
16020 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mode;.        }.
16030 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a        }..      z
16040 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c  Opt = &zVal[nVal
16050 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  +1];.    }..  }e
16060 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  lse{.    zFile =
16070 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
16080 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69  4(nUri+2);.    i
16090 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
160a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
160b0 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79  BKPT;.    memcpy
160c0 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55  (zFile, zUri, nU
160d0 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e  ri);.    zFile[n
160e0 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  Uri] = '\0';.   
160f0 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d   zFile[nUri+1] =
16100 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73   '\0';.    flags
16110 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
16120 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  _URI;.  }..  *pp
16130 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
16140 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20  s_find(zVfs);.  
16150 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b  if( *ppVfs==0 ){
16160 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
16170 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16180 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25  ("no such vfs: %
16190 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72  s", zVfs);.    r
161a0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
161b0 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69  ;.  }. parse_uri
161c0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
161d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
161e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
161f0 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  ile);.    zFile 
16200 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61  = 0;.  }.  *pFla
16210 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70  gs = flags;.  *p
16220 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20  zFile = zFile;. 
16230 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
16240 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16250 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  ne does the work
16260 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61   of opening a da
16270 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66  tabase on behalf
16280 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   of.** sqlite3_o
16290 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65  pen() and sqlite
162a0 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20  3_open16(). The 
162b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
162c0 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a  e "zFilename"  .
162d0 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f  ** is UTF-8 enco
162e0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
162f0 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  nt openDatabase(
16300 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16310 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74  Filename, /* Dat
16320 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55  abase filename U
16330 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a  TF-8 encoded */.
16340 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
16350 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  ,        /* OUT:
16360 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61   Returned databa
16370 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75  se handle */.  u
16380 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
16390 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69  s,    /* Operati
163a0 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20  onal flags */.  
163b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
163c0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
163d0 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
163e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
163f0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
16400 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
16410 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64  e allocated hand
16420 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
16430 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16450 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
16460 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66   int isThreadsaf
16470 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
16480 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72   /* True for thr
16490 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69  eadsafe connecti
164a0 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
164b0 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Open = 0;       
164c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
164d0 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  name argument to
164e0 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70   pass to BtreeOp
164f0 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  en() */.  char *
16500 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
16510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
16520 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
16530 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
16540 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
16550 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
16560 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d  RMOR.  if( ppDb=
16570 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
16580 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
16590 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
165a0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
165b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
165c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
165d0 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
165e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
165f0 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  rc;.#endif..  /*
16600 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73   Only allow sens
16610 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
16620 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  s of bits in the
16630 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e   flags argument.
16640 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e    .  ** Throw an
16650 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f   error if any no
16660 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74  n-sense combinat
16670 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66  ion is used.  If
16680 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20   we.  ** do not 
16690 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f  block illegal co
166a0 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c  mbinations here,
166b0 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65   it could trigge
166c0 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20  r.  ** assert() 
166d0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65  statements in de
166e0 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65  eper layers.  Se
166f0 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
16700 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20  ons.  ** are:.  
16710 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c  **.  **  1:  SQL
16720 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16730 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49  Y.  **  2:  SQLI
16740 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
16750 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49  E.  **  6:  SQLI
16760 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
16770 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16780 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73  CREATE.  */.  as
16790 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
167a0 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30  N_READONLY  == 0
167b0 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x01 );.  assert(
167c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
167d0 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29  DWRITE == 0x02 )
167e0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
167f0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20  TE_OPEN_CREATE  
16800 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74    == 0x04 );.  t
16810 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
16820 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b  ags&7))==0x02 );
16830 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a   /* READONLY */.
16840 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
16850 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34  (flags&7))==0x04
16860 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
16870 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
16880 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
16890 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x40 ); /* READW
168a0 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f  RITE | CREATE */
168b0 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61  .  if( ((1<<(fla
168c0 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d  gs&7)) & 0x46)==
168d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
168e0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
168f0 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36  PT;  /* IMP: R-6
16900 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20  5497-44594 */.  
16910 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  }..  if( sqlite3
16920 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
16930 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  reMutex==0 ){.  
16940 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
16950 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
16960 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
16970 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20  PEN_NOMUTEX ){. 
16980 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
16990 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
169a0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
169b0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29  OPEN_FULLMUTEX )
169c0 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
169d0 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  fe = 1;.  }else{
169e0 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
169f0 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e = sqlite3Globa
16a00 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
16a10 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c  ex;.  }.  if( fl
16a20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16a30 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29  N_PRIVATECACHE )
16a40 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  {.    flags &= ~
16a50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
16a60 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65  EDCACHE;.  }else
16a70 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
16a80 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
16a90 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
16aa0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
16ab0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
16ac0 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  CHE;.  }..  /* R
16ad0 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
16ae0 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
16af0 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  s parameter.  **
16b00 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  .  ** The SQLITE
16b10 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e  _OPEN_NOMUTEX an
16b20 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  d SQLITE_OPEN_FU
16b30 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65  LLMUTEX flags we
16b40 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69  re.  ** dealt wi
16b50 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  th in the previo
16b60 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20  us code block.  
16b70 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74  Besides these, t
16b80 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c  he only.  ** val
16b90 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66  id input flags f
16ba0 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
16bb0 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f  v2() are SQLITE_
16bc0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20  OPEN_READONLY,. 
16bd0 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
16be0 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54  READWRITE, SQLIT
16bf0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53  E_OPEN_CREATE, S
16c00 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
16c10 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c  DCACHE,.  ** SQL
16c20 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
16c30 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20  CACHE, and some 
16c40 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20  reserved bits.  
16c50 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20  Silently mask.  
16c60 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72  ** off all other
16c70 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66   flags..  */.  f
16c80 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49  lags &=  ~( SQLI
16c90 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
16ca0 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
16cb0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16cc0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16ce0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
16cf0 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B |.            
16d00 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
16d10 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  EMP_DB | .      
16d20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16d30 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
16d40 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  B | .           
16d50 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16d60 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  MAIN_JOURNAL | .
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16d80 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
16d90 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
16da0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16db0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
16dc0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
16dd0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
16de0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a  ASTER_JOURNAL |.
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16e00 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
16e10 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
16e20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16e30 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20  FULLMUTEX |.    
16e40 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16e50 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20  E_OPEN_WAL.     
16e60 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
16e70 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
16e80 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
16e90 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
16ea0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
16eb0 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
16ec0 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
16ed0 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
16ee0 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
16ef0 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d  dsafe ){.    db-
16f00 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
16f10 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
16f20 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
16f30 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
16f40 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
16f50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
16f60 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
16f70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
16f80 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
16f90 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
16fa0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
16fb0 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
16fc0 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
16fd0 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
16fe0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
16ff0 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
17000 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
17010 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  atic;..  assert(
17020 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
17030 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72  it)==sizeof(aHar
17040 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d  dLimit) );.  mem
17050 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20  cpy(db->aLimit, 
17060 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65  aHardLimit, size
17070 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b  of(db->aLimit));
17080 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  .  db->aLimit[SQ
17090 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
170a0 52 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c  R_THREADS] = SQL
170b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b  ITE_DEFAULT_WORK
170c0 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62  ER_THREADS;.  db
170d0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
170e0 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f  ;.  db->nextAuto
170f0 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e  vac = -1;.  db->
17100 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33  szMmap = sqlite3
17110 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
17120 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50  map;.  db->nextP
17130 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64  agesize = 0;.  d
17140 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61  b->nMaxSorterMma
17150 70 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a  p = 0x7FFFFFFF;.
17160 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
17170 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
17180 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61  mes | SQLITE_Ena
17190 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c  bleTrigger | SQL
171a0 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23  ITE_CacheSpill.#
171b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
171c0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  TE_DEFAULT_AUTOM
171d0 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53  ATIC_INDEX) || S
171e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
171f0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17210 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
17220 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  x.#endif.#if SQL
17230 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54  ITE_DEFAULT_CKPT
17240 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20  FULLFSYNC.      
17250 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
17260 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e  ITE_CkptFullFSyn
17270 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  c.#endif.#if SQL
17280 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
17290 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20  _FORMAT<4.      
172a0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
172b0 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
172c0 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  t.#endif.#ifdef 
172d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
172e0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17300 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
17310 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20  sion.#endif.#if 
17320 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52  SQLITE_DEFAULT_R
17330 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52  ECURSIVE_TRIGGER
17340 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S.              
17350 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54     | SQLITE_RecT
17360 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23  riggers.#endif.#
17370 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
17380 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
17390 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54  N_KEYS) && SQLIT
173a0 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
173b0 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20  N_KEYS.         
173c0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
173d0 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e  _ForeignKeys.#en
173e0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
173f0 53 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55  SQLITE_REVERSE_U
17400 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53  NORDERED_SELECTS
17410 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
17420 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65     | SQLITE_Reve
17430 72 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a  rseOrder.#endif.
17440 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
17450 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
17460 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17480 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a  | SQLITE_CellSiz
17490 65 43 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  eCk.#endif.#if d
174a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
174b0 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49  ABLE_FTS3_TOKENI
174c0 5a 45 52 29 0a 20 20 20 20 20 20 20 20 20 20 20  ZER).           
174d0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
174e0 74 73 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e  ts3Tokenizer.#en
174f0 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
17500 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
17510 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
17520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17530 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
17540 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
17550 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
17560 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
17570 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
17580 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
17590 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77  BINARY. BINARY w
175a0 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54  orks for both UT
175b0 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46  F-8.  ** and UTF
175c0 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65  -16, so add a ve
175d0 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  rsion for each t
175e0 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65  o avoid any unne
175f0 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e  cessary.  ** con
17600 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  versions. The on
17610 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61  ly error that ca
17620 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20  n occur here is 
17630 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
17640 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56  re..  **.  ** EV
17650 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37  IDENCE-OF: R-527
17660 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20  86-44878 SQLite 
17670 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75  defines three bu
17680 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
17690 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  .  ** functions:
176a0 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
176b0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
176c0 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
176d0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
176e0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
176f0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
17700 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
17710 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
17720 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
17730 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
17740 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
17750 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
17760 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  Y, SQLITE_UTF16L
17770 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
17780 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
17790 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
177a0 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
177b0 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
177c0 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
177d0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
177e0 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
177f0 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
17800 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
17810 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
17820 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17830 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
17840 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45  _out;.  }.  /* E
17850 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
17860 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65  308-17224 The de
17870 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
17880 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  function for all
17890 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73  .  ** strings is
178a0 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20   BINARY. .  */. 
178b0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
178c0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
178d0 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
178e0 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42  TF8, sqlite3StrB
178f0 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73  INARY, 0);.  ass
17900 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
17910 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50  ll!=0 );..  /* P
17920 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
17930 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20  e/URI argument. 
17940 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
17950 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63  gs = flags;.  rc
17960 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
17970 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
17980 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
17990 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
179a0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
179b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
179c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
179d0 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69  ITE_NOMEM ) sqli
179e0 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
179f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17a00 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
17a10 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
17a20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
17a30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17a40 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
17a50 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17a60 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
17a70 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
17a80 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
17a90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
17aa0 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
17ab0 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
17ac0 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ae0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
17af0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
17b00 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
17b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
17b20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
17b30 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
17b40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17b50 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
17b60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17b70 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67  r(db, rc);.    g
17b80 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
17b90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
17ba0 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b  eeEnter(db->aDb[
17bb0 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
17bc0 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
17bd0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
17be0 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
17bf0 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  pBt);.  if( !db-
17c00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
17c10 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41  ENC(db) = SCHEMA
17c20 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69  _ENC(db);.  sqli
17c30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 64 62  te3BtreeLeave(db
17c40 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
17c50 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
17c60 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
17c70 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a  emaGet(db, 0);..
17c80 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
17c90 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
17ca0 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
17cb0 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72  ase is FULL; for
17cc0 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64   the temp.  ** d
17cd0 61 74 61 62 61 73 65 20 69 74 20 69 73 20 4f 46  atabase it is OF
17ce0 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  F. This matches 
17cf0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
17d00 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
17d10 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e  .  db->aDb[0].zN
17d20 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
17d30 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
17d40 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52 5f  y_level = PAGER_
17d50 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c  SYNCHRONOUS_FULL
17d60 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  ;.  db->aDb[1].z
17d70 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
17d80 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
17d90 74 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52  ty_level = PAGER
17da0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
17db0 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
17dc0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
17dd0 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
17de0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
17df0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
17e00 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
17e10 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
17e20 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
17e30 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
17e40 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
17e50 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
17e60 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
17e70 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
17e80 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
17e90 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
17ea0 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
17eb0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
17ec0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
17ed0 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
17ee0 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69  PerConnectionBui
17ef0 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
17f00 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75  );..  /* Load au
17f10 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f  tomatic extensio
17f20 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20  ns - extensions 
17f30 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72  that have been r
17f40 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75  egistered.  ** u
17f50 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
17f60 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e  _automatic_exten
17f70 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f  sion() API..  */
17f80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17f90 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69  errcode(db);.  i
17fa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17fb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   ){.    sqlite3A
17fc0 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  utoLoadExtension
17fd0 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  s(db);.    rc = 
17fe0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
17ff0 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  db);.    if( rc!
18000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18010 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
18020 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
18030 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18040 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20  ABLE_FTS1.  if( 
18050 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
18060 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  d ){.    extern 
18070 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49  int sqlite3Fts1I
18080 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
18090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
180a0 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts1Init(db);.  }
180b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
180c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
180d0 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S2.  if( !db->ma
180e0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
180f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18100 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
18110 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71  lite3Fts2Init(sq
18120 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
18130 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  = sqlite3Fts2Ini
18140 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
18150 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
18160 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20  _ENABLE_FTS3 /* 
18170 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
18180 66 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f  fined by SQLITE_
18190 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20  ENABLE_FTS4 */. 
181a0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
181b0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
181c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
181d0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
181e0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
181f0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
18200 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20  TE_ENABLE_FTS5. 
18210 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18220 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18240 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
18250 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
18260 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
18270 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20  TE_ENABLE_ICU.  
18280 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18290 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
182a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
182b0 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69   = sqlite3IcuIni
182c0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
182d0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
182e0 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20  _ENABLE_RTREE.  
182f0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18300 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
18310 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
18320 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  = sqlite3RtreeIn
18330 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
18340 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18350 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f  E_ENABLE_DBSTAT_
18360 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e  VTAB.  if( !db->
18370 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
18380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
18390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
183a0 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64  DbstatRegister(d
183b0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
183c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
183d0 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28  ABLE_JSON1.  if(
183e0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
183f0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
18400 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
18410 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28  qlite3Json1Init(
18420 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
18430 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44  .  /* -DSQLITE_D
18440 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
18450 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c  ODE=1 makes EXCL
18460 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c  USIVE the defaul
18470 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
18480 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44  ode.  -DSQLITE_D
18490 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
184a0 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41  ODE=0 make NORMA
184b0 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  L the default lo
184c0 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
184d0 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20    Doing nothing 
184e0 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65  at all also make
184f0 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  s NORMAL the def
18500 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ault..  */.#ifde
18510 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
18520 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20  _LOCKING_MODE.  
18530 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  db->dfltLockMode
18540 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
18550 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a  T_LOCKING_MODE;.
18560 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f    sqlite3PagerLo
18570 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65  ckingMode(sqlite
18580 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
18590 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20  aDb[0].pBt),.   
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
185c0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
185d0 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  DE);.#endif..  i
185e0 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45  f( rc ) sqlite3E
185f0 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20  rror(db, rc);.. 
18600 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
18610 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
18620 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
18630 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
18640 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
18650 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
18660 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
18680 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18690 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
186a0 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
186b0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
186c0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
186d0 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
186e0 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  NT);..opendb_out
186f0 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  :.  if( db ){.  
18700 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75    assert( db->mu
18710 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65  tex!=0 || isThre
18720 61 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20  adsafe==0.      
18730 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
18740 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
18750 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  lMutex==0 );.   
18760 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
18770 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
18780 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
18790 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
187a0 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
187b0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
187c0 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63  OMEM );.  if( rc
187d0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
187e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  {.    sqlite3_cl
187f0 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20  ose(db);.    db 
18800 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
18810 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18820 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
18830 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53  = SQLITE_MAGIC_S
18840 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62  ICK;.  }.  *ppDb
18850 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51   = db;.#ifdef SQ
18860 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
18870 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  OG.  if( sqlite3
18880 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
18890 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  llog ){.    /* O
188a0 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64  pening a db hand
188b0 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
188c0 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30  eter is passed 0
188d0 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  . */.    void *p
188e0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Arg = sqlite3Glo
188f0 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
18900 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  gArg;.    sqlite
18910 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
18920 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20  qllog(pArg, db, 
18930 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
18940 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
18950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
18960 5f 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72 63  _CODEC).  if( rc
18970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18980 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
18990 48 65 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  HexKey = sqlite3
189a0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
189b0 4f 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29 3b  Open, "hexkey");
189c0 0a 20 20 20 20 69 66 28 20 7a 48 65 78 4b 65 79  .    if( zHexKey
189d0 20 26 26 20 7a 48 65 78 4b 65 79 5b 30 5d 20 29   && zHexKey[0] )
189e0 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65  {.      u8 iByte
189f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
18a00 20 20 20 20 20 63 68 61 72 20 7a 4b 65 79 5b 34       char zKey[4
18a10 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0];.      for(i=
18a20 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69  0, iByte=0; i<si
18a30 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26 20  zeof(zKey)*2 && 
18a40 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
18a50 7a 48 65 78 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b  zHexKey[i]); i++
18a60 29 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74 65  ){.        iByte
18a70 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20   = (iByte<<4) + 
18a80 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
18a90 7a 48 65 78 4b 65 79 5b 69 5d 29 3b 0a 20 20 20  zHexKey[i]);.   
18aa0 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21 3d       if( (i&1)!=
18ab0 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20  0 ) zKey[i/2] = 
18ac0 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20  iByte;.      }. 
18ad0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79       sqlite3_key
18ae0 5f 76 32 28 64 62 2c 20 30 2c 20 7a 4b 65 79 2c  _v2(db, 0, zKey,
18af0 20 69 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   i/2);.    }.  }
18b00 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18b10 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20  3_free(zOpen);. 
18b20 20 72 65 74 75 72 6e 20 72 63 20 26 20 30 78 66   return rc & 0xf
18b30 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  f;.}../*.** Open
18b40 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
18b50 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
18b60 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63  qlite3_open(.  c
18b70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
18b80 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
18b90 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65   **ppDb .){.  re
18ba0 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
18bb0 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44  e(zFilename, ppD
18bc0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
18bd0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18be0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
18bf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
18c00 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  ATE, 0);.}.int s
18c10 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a  qlite3_open_v2(.
18c20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
18c30 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74  lename,   /* Dat
18c40 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28  abase filename (
18c50 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
18c60 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
18c70 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69      /* OUT: SQLi
18c80 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  te db handle */.
18c90 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
18ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
18cb0 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
18cc0 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20  ar *zVfs        
18cd0 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d  /* Name of VFS m
18ce0 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a  odule to use */.
18cf0 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
18d00 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d  Database(filenam
18d10 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e  e, ppDb, (unsign
18d20 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56  ed int)flags, zV
18d30 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  fs);.}..#ifndef 
18d40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
18d50 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  6./*.** Open a n
18d60 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
18d70 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
18d80 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e  e3_open16(.  con
18d90 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
18da0 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
18db0 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20  *ppDb.){.  char 
18dc0 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65  const *zFilename
18dd0 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d  8;   /* zFilenam
18de0 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  e encoded in UTF
18df0 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54  -8 instead of UT
18e00 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-16 */.  sqlite
18e10 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
18e20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
18e30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
18e40 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70  PI_ARMOR.  if( p
18e50 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pDb==0 ) return 
18e60 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
18e70 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70  PT;.#endif.  *pp
18e80 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
18e90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18ea0 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
18eb0 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
18ec0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
18ed0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
18ee0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
18ef0 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  0 ) zFilename = 
18f00 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20 70 56  "\000\000";.  pV
18f10 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
18f20 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
18f30 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
18f40 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
18f50 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
18f60 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
18f70 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
18f80 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
18f90 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
18fa0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
18fb0 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
18fc0 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
18fd0 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
18fe0 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
19000 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
19010 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
19020 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
19030 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
19040 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
19050 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
19060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
19070 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
19080 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
19090 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
190a0 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 2a 70 70    SCHEMA_ENC(*pp
190b0 44 62 29 20 3d 20 45 4e 43 28 2a 70 70 44 62 29  Db) = ENC(*ppDb)
190c0 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
190d0 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  ATIVE;.    }.  }
190e0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
190f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
19100 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
19110 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
19120 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 30  .  return rc & 0
19130 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  xff;.}.#endif /*
19140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
19150 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
19160 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
19170 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
19180 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19190 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
191a0 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
191b0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  e_collation(.  s
191c0 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
191d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
191e0 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
191f0 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
19200 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
19210 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
19220 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
19230 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  id*).){.  return
19240 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
19250 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
19260 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74   zName, enc, pCt
19270 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
19280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
19290 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
192a0 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
192b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
192c0 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
192d0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
192e0 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73  ollation_v2(.  s
192f0 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
19300 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
19310 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
19320 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
19330 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
19340 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
19350 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
19360 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
19370 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
19380 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20  int rc;..#ifdef 
19390 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
193a0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
193b0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
193c0 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
193d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
193e0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
193f0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
19400 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
19410 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
19420 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
19430 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
19440 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
19450 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
19460 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
19470 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20  re, xDel);.  rc 
19480 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
19490 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
194a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
194b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
194c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
194d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
194e0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
194f0 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
19500 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
19510 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
19520 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
19530 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
19540 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20  _collation16(.  
19550 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
19560 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
19570 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  e,.  int enc, . 
19580 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
19590 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
195a0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
195b0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
195c0 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
195d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
195e0 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23  char *zName8;..#
195f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19600 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
19610 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
19620 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
19630 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
19640 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
19650 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
19660 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
19670 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
19680 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
19690 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
196a0 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65   zName8 = sqlite
196b0 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e  3Utf16to8(db, zN
196c0 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
196d0 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
196e0 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20  if( zName8 ){.  
196f0 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
19700 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
19710 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  8, (u8)enc, pCtx
19720 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
19730 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19740 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20  e(db, zName8);. 
19750 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
19760 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
19770 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
19780 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
19790 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
197a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
197b0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
197c0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
197d0 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
197e0 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
197f0 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
19800 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19810 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
19820 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
19830 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
19840 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
19850 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
19860 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
19870 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20  eded(.  sqlite3 
19880 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
19890 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
198a0 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
198b0 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  ed)(void*,sqlite
198c0 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
198d0 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
198e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
198f0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
19900 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
19910 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
19920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
19930 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
19940 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
19950 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
19960 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
19970 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65  Needed = xCollNe
19980 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  eded;.  db->xCol
19990 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20  lNeeded16 = 0;. 
199a0 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
199b0 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
199c0 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
199d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
199e0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
199f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
19a00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19a10 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
19a20 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
19a30 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
19a40 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
19a50 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
19a60 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
19a70 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
19a80 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
19a90 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19aa0 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
19ab0 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
19ac0 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20  ion_needed16(.  
19ad0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
19ae0 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
19af0 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
19b00 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f  CollNeeded16)(vo
19b10 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
19b20 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
19b30 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65 66  void*).){.#ifdef
19b40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
19b50 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
19b60 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
19b70 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
19b80 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
19b90 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
19ba0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
19bb0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
19bc0 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
19bd0 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c   = 0;.  db->xCol
19be0 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c  lNeeded16 = xCol
19bf0 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d  lNeeded16;.  db-
19c00 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
19c10 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
19c20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
19c30 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
19c40 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
19c50 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
19c60 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19c70 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
19c80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
19c90 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
19ca0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19cb0 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69  now an anachroni
19cc0 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  sm. It used to b
19cd0 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65  e used to recove
19ce0 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c  r from a.** mall
19cf0 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75  oc() failure, bu
19d00 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65  t SQLite now doe
19d10 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63  s this automatic
19d20 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
19d30 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
19d40 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ver(void){.  ret
19d50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19d60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
19d70 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
19d80 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61  er or not the da
19d90 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19da0 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  n is in autocomm
19db0 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74  it.** mode.  Ret
19dc0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
19dd0 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
19de0 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  ot.  Autocommit 
19df0 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79  mode is on.** by
19e00 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63   default.  Autoc
19e10 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65  ommit is disable
19e20 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61  d by a BEGIN sta
19e30 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61  tement and reena
19e40 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e  bled.** by the n
19e50 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  ext COMMIT or RO
19e60 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  LLBACK..*/.int s
19e70 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
19e80 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
19e90 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
19ea0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
19eb0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
19ec0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
19ed0 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
19ee0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
19ef0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
19f00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
19f10 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
19f20 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
19f30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
19f40 74 69 6e 65 73 20 61 72 65 20 73 75 62 73 74 69  tines are substi
19f50 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61  tutes for consta
19f60 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  nts SQLITE_CORRU
19f70 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  PT,.** SQLITE_MI
19f80 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  SUSE, SQLITE_CAN
19f90 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 4e 4f  TOPEN, SQLITE_NO
19fa0 4d 45 4d 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  MEM and possibly
19fb0 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
19fc0 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79  constants.  They
19fd0 20 73 65 72 76 65 20 74 77 6f 20 70 75 72 70 6f   serve two purpo
19fe0 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
19ff0 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
1a000 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
1a010 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
1a020 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
1a030 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
1a040 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
1a050 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
1a060 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
1a070 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
1a080 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
1a090 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
1a0a0 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
1a0b0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
1a0c0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
1a0d0 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
1a0e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1a0f0 65 70 6f 72 74 45 72 72 6f 72 28 69 6e 74 20 69  eportError(int i
1a100 45 72 72 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  Err, int lineno,
1a110 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1a120 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  pe){.  sqlite3_l
1a130 6f 67 28 69 45 72 72 2c 20 22 25 73 20 61 74 20  og(iErr, "%s at 
1a140 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
1a150 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
1a160 20 20 20 7a 54 79 70 65 2c 20 6c 69 6e 65 6e 6f     zType, lineno
1a170 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75  , 20+sqlite3_sou
1a180 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75  rceid());.  retu
1a190 72 6e 20 69 45 72 72 3b 0a 7d 0a 69 6e 74 20 73  rn iErr;.}.int s
1a1a0 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72  qlite3CorruptErr
1a1b0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1a1c0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1a1d0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1a1e0 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1a1f0 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28  urn reportError(
1a200 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1a210 6c 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61 73  lineno, "databas
1a220 65 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b 0a  e corruption");.
1a230 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73  }.int sqlite3Mis
1a240 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  useError(int lin
1a250 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1a260 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1a270 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1a280 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74  .  return report
1a290 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4d 49 53  Error(SQLITE_MIS
1a2a0 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20 22 6d 69  USE, lineno, "mi
1a2b0 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74 20 73 71  suse");.}.int sq
1a2c0 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72  lite3CantopenErr
1a2d0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1a2e0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1a2f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1a300 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1a310 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28  urn reportError(
1a320 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
1a330 20 6c 69 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74   lineno, "cannot
1a340 20 6f 70 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a   open file");.}.
1a350 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a360 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  BUG.int sqlite3N
1a370 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69  omemError(int li
1a380 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1a390 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1a3a0 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1a3b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72  ;.  return repor
1a3c0 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f  tError(SQLITE_NO
1a3d0 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f  MEM, lineno, "OO
1a3e0 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  M");.}.int sqlit
1a3f0 65 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f  e3IoerrnomemErro
1a400 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
1a410 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1a420 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1a430 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Log!=0 );.  retu
1a440 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28 53  rn reportError(S
1a450 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1a460 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f 4f 20  M, lineno, "I/O 
1a470 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a 7d 0a 23  OOM error");.}.#
1a480 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
1a490 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
1a4a0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
1a4b0 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
1a4c0 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
1a4d0 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
1a4e0 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
1a4f0 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
1a500 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
1a510 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
1a520 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
1a530 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
1a540 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
1a550 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
1a560 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
1a570 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
1a580 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
1a590 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
1a5a0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
1a5b0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
1a5c0 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69  p(void){.}.#endi
1a5d0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
1a5e0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
1a5f0 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69   about a specifi
1a600 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61  c column of a da
1a610 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
1a620 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20   See comment in 
1a630 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74  sqlite3.h (sqlit
1a640 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61  e.h.in) for deta
1a650 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
1a660 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
1a670 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c  _metadata(.  sql
1a680 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1a690 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
1a6a0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f  ection handle */
1a6b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a6c0 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  DbName,        /
1a6d0 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
1a6e0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
1a6f0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e  st char *zTableN
1a700 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  ame,     /* Tabl
1a710 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73  e name */.  cons
1a720 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e  t char *zColumnN
1a730 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  ame,    /* Colum
1a740 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72  n name */.  char
1a750 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54   const **pzDataT
1a760 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55  ype,    /* OUTPU
1a770 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61  T: Declared data
1a780 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
1a790 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65  const **pzCollSe
1a7a0 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  q,     /* OUTPUT
1a7b0 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  : Collation sequ
1a7c0 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  ence name */.  i
1a7d0 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20  nt *pNotNull,   
1a7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1a7f0 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f  TPUT: True if NO
1a800 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
1a810 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e  t exists */.  in
1a820 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20  t *pPrimaryKey, 
1a830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a840 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
1a850 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a  umn part of PK *
1a860 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e  /.  int *pAutoin
1a870 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
1a880 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1a890 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74  if column is aut
1a8a0 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29  o-increment */.)
1a8b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
1a8c0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
1a8d0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
1a8e0 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   0;.  Column *pC
1a8f0 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  ol = 0;.  int iC
1a900 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ol = 0;.  char c
1a910 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20  onst *zDataType 
1a920 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
1a930 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b  t *zCollSeq = 0;
1a940 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d  .  int notnull =
1a950 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72   0;.  int primar
1a960 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ykey = 0;.  int 
1a970 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23  autoinc = 0;...#
1a980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a990 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1a9a0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1a9b0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
1a9c0 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29   zTableName==0 )
1a9d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1a9e0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1a9f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1aa00 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74  * Ensure the dat
1aa10 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
1aa20 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a   been loaded */.
1aa30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1aa40 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1aa50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1aa60 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
1aa70 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
1aa80 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  (db, &zErrMsg);.
1aa90 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1aaa0 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =rc ){.    goto 
1aab0 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
1aac0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
1aad0 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
1aae0 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71  n */.  pTab = sq
1aaf0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
1ab00 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  b, zTableName, z
1ab10 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  DbName);.  if( !
1ab20 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53  pTab || pTab->pS
1ab30 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61  elect ){.    pTa
1ab40 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  b = 0;.    goto 
1ab50 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
1ab60 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f    /* Find the co
1ab70 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69  lumn for which i
1ab80 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64  nfo is requested
1ab90 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d   */.  if( zColum
1aba0 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nName==0 ){.    
1abb0 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 65 78 69  /* Query for exi
1abc0 73 74 61 6e 63 65 20 6f 66 20 74 61 62 6c 65 20  stance of table 
1abd0 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  only */.  }else{
1abe0 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
1abf0 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
1ac00 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
1ac10 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
1ac20 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
1ac30 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
1ac40 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
1ac50 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  me, zColumnName)
1ac60 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1ac70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1ac80 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70  .    if( iCol==p
1ac90 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
1aca0 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
1acb0 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
1acc0 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e  IsRowid(zColumnN
1acd0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
1ace0 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
1acf0 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ey;.        pCol
1ad00 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54   = iCol>=0 ? &pT
1ad10 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a  ab->aCol[iCol] :
1ad20 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1ad30 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
1ad40 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
1ad50 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20  error_out;.     
1ad60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1ad70 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1ad80 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68   block stores th
1ad90 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  e meta informati
1ada0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  on that will be 
1adb0 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f  returned.  ** to
1adc0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c   the caller in l
1add0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a  ocal variables z
1ade0 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53  DataType, zCollS
1adf0 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69  eq, notnull, pri
1ae00 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64  marykey.  ** and
1ae10 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69   autoinc. At thi
1ae20 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72  s point there ar
1ae30 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74  e two possibilit
1ae40 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ies:.  ** .  ** 
1ae50 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69      1. The speci
1ae60 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fied column name
1ae70 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69   was rowid", "oi
1ae80 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20  d" or "_rowid_" 
1ae90 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  .  **        and
1aea0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70   there is no exp
1aeb0 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
1aec0 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20   IPK column. .  
1aed0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54  **.  **     2. T
1aee0 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  he table is not 
1aef0 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63  a view and the c
1af00 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74  olumn name ident
1af10 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20  ified an .  **  
1af20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79        explicitly
1af30 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
1af40 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f  . Copy meta info
1af50 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43  rmation from *pC
1af60 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ol..  */ .  if( 
1af70 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74  pCol ){.    zDat
1af80 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 53  aType = sqlite3S
1af90 74 72 4e 65 78 74 28 70 43 6f 6c 2d 3e 7a 4e 61  trNext(pCol->zNa
1afa0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 61  me);.    if( zDa
1afb0 74 61 54 79 70 65 5b 30 5d 3d 3d 30 20 29 20 7a  taType[0]==0 ) z
1afc0 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
1afd0 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f    zCollSeq = pCo
1afe0 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f  l->zColl;.    no
1aff0 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f  tnull = pCol->no
1b000 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72  tNull!=0;.    pr
1b010 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f  imarykey  = (pCo
1b020 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  l->colFlags & CO
1b030 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d  LFLAG_PRIMKEY)!=
1b040 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d  0;.    autoinc =
1b050 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43   pTab->iPKey==iC
1b060 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  ol && (pTab->tab
1b070 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
1b080 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20  ncrement)!=0;.  
1b090 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61  }else{.    zData
1b0a0 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
1b0b0 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
1b0c0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
1b0d0 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  !zCollSeq ){.   
1b0e0 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69   zCollSeq = sqli
1b0f0 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
1b100 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20  }..error_out:.  
1b110 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b120 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
1b130 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63  Whether the func
1b140 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65  tion call succee
1b150 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73  ded or failed, s
1b160 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  et the output pa
1b170 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f  rameters.  ** to
1b180 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20   whatever their 
1b190 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72  local counterpar
1b1a0 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61  ts contain. If a
1b1b0 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
1b1c0 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73  r,.  ** this has
1b1d0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a   the effect of z
1b1e0 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75  eroing all outpu
1b1f0 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  t parameters..  
1b200 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54  */.  if( pzDataT
1b210 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70  ype ) *pzDataTyp
1b220 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20  e = zDataType;. 
1b230 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29   if( pzCollSeq )
1b240 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43   *pzCollSeq = zC
1b250 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e  ollSeq;.  if( pN
1b260 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75  otNull ) *pNotNu
1b270 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20  ll = notnull;.  
1b280 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20  if( pPrimaryKey 
1b290 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d  ) *pPrimaryKey =
1b2a0 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
1b2b0 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70  f( pAutoinc ) *p
1b2c0 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e  Autoinc = autoin
1b2d0 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  c;..  if( SQLITE
1b2e0 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62  _OK==rc && !pTab
1b2f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1b300 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1b310 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  g);.    zErrMsg 
1b320 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1b330 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  (db, "no such ta
1b340 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25  ble column: %s.%
1b350 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a  s", zTableName,.
1b360 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e          zColumnN
1b370 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
1b380 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1b390 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57  .  sqlite3ErrorW
1b3a0 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28  ithMsg(db, rc, (
1b3b0 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c  zErrMsg?"%s":0),
1b3c0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c   zErrMsg);.  sql
1b3d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1b3e0 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20  ErrMsg);.  rc = 
1b3f0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
1b400 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
1b410 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1b420 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1b430 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b440 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
1b450 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
1b460 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
1b470 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69  time slept..*/.i
1b480 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  nt sqlite3_sleep
1b490 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69  (int ms){.  sqli
1b4a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
1b4b0 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20   int rc;.  pVfs 
1b4c0 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
1b4d0 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66  nd(0);.  if( pVf
1b4e0 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
1b4f0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
1b500 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69  tion works in mi
1b510 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20  lliseconds, but 
1b520 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f  the underlying O
1b530 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41  sSleep() .  ** A
1b540 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63  PI uses microsec
1b550 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20  onds. Hence the 
1b560 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72  1000's..  */.  r
1b570 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c  c = (sqlite3OsSl
1b580 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d  eep(pVfs, 1000*m
1b590 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  s)/1000);.  retu
1b5a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b5b0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
1b5c0 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  e the extended r
1b5d0 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a  esult codes..*/.
1b5e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
1b5f0 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
1b600 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
1b610 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65  nt onoff){.#ifde
1b620 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b630 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1b640 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1b650 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1b660 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1b670 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1b680 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1b690 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1b6a0 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20    db->errMask = 
1b6b0 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66  onoff ? 0xffffff
1b6c0 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c  ff : 0xff;.  sql
1b6d0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b6e0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1b6f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
1b710 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
1b720 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61  l method on a pa
1b730 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1b740 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1b750 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73  3_file_control(s
1b760 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1b770 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
1b780 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
1b790 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Arg){.  int rc =
1b7a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1b7b0 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a   Btree *pBtree;.
1b7c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b7d0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1b7e0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1b7f0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1b800 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b810 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1b820 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1b830 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1b840 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d  tex);.  pBtree =
1b850 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
1b860 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
1b870 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  e);.  if( pBtree
1b880 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
1b890 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
1b8a0 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20  e3_file *fd;.   
1b8b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b8c0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1b8d0 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
1b8e0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65  BtreePager(pBtre
1b8f0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
1b900 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20  pPager!=0 );.   
1b910 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67   fd = sqlite3Pag
1b920 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
1b930 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d      assert( fd!=
1b940 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  0 );.    if( op=
1b950 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49  =SQLITE_FCNTL_FI
1b960 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  LE_POINTER ){.  
1b970 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69      *(sqlite3_fi
1b980 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a  le**)pArg = fd;.
1b990 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b9a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
1b9b0 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1b9c0 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52  CNTL_VFS_POINTER
1b9d0 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
1b9e0 74 65 33 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d  te3_vfs**)pArg =
1b9f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
1ba00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1ba10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ba20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1ba30 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a  ==SQLITE_FCNTL_J
1ba40 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29  OURNAL_POINTER )
1ba50 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
1ba60 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
1ba70 73 71 6c 69 74 65 33 50 61 67 65 72 4a 72 6e 6c  sqlite3PagerJrnl
1ba80 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
1ba90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1baa0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
1bab0 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
1bac0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1bad0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1bae0 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
1baf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bb00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1bb10 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20  TFOUND;.    }.  
1bb20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1bb30 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1bb40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1bb50 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1bb60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1bb70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
1bb80 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
1bb90 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
1bba0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1bbb0 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
1bbc0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1bbd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1bbe0 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
1bbf0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1bc00 54 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20  TER(op);.#else. 
1bc10 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
1bc20 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
1bc30 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1bc40 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1bc50 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
1bc60 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
1bc70 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  NG..    */.    c
1bc80 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1bc90 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b  TRL_PRNG_SAVE: {
1bca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
1bcb0 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20  ngSaveState();. 
1bcc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bcd0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1bce0 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61   Restore the sta
1bcf0 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74  te of the PRNG t
1bd00 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65  o the last state
1bd10 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20   saved using.   
1bd20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20   ** PRNG_SAVE.  
1bd30 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73  If PRNG_SAVE has
1bd40 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1bd50 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a  en called, then.
1bd60 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62      ** this verb
1bd70 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f   acts like PRNG_
1bd80 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20  RESET..    */.  
1bd90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1bda0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
1bdb0 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ORE: {.      sql
1bdc0 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53  ite3PrngRestoreS
1bdd0 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
1bde0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1bdf0 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20  /*.    ** Reset 
1be00 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f  the PRNG back to
1be10 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a   its uninitializ
1be20 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e  ed state.  The n
1be30 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ext call.    ** 
1be40 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  to sqlite3_rando
1be50 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73  mness() will res
1be60 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69  eed the PRNG usi
1be70 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c  ng a single call
1be80 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  .    ** to the x
1be90 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f  Randomness metho
1bea0 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  d of the default
1beb0 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   VFS..    */.   
1bec0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1bed0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
1bee0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1bef0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30  3_randomness(0,0
1bf00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1bf10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1bf20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1bf30 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45  st_control(BITVE
1bf40 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72  C_TEST, size, pr
1bf50 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20  ogram).    **.  
1bf60 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20    ** Run a test 
1bf70 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63  against a Bitvec
1bf80 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e   object of size.
1bf90 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72    The program ar
1bfa0 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73  gument.    ** is
1bfb0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
1bfc0 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e  egers that defin
1bfd0 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65  es the test.  Re
1bfe0 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20  turn -1 on a.   
1bff0 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
1c000 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f  ation error, 0 o
1c010 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f  n success, or no
1c020 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72  n-zero for an er
1c030 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  ror..    ** See 
1c040 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65  the sqlite3Bitve
1c050 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66  cBuiltinTest() f
1c060 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1c070 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
1c080 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1c090 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
1c0a0 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20  C_TEST: {.      
1c0b0 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
1c0c0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1c0d0 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f  int *aProg = va_
1c0e0 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
1c0f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c100 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
1c110 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20  st(sz, aProg);. 
1c120 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c130 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1c140 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1c150 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53  ontrol(FAULT_INS
1c160 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29  TALL, xCallback)
1c170 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1c180 72 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65  rrange to invoke
1c190 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65   xCallback() whe
1c1a0 6e 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75  never sqlite3Fau
1c1b0 6c 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65  ltSim() is calle
1c1c0 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61  d,.    ** if xCa
1c1d0 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55  llback is not NU
1c1e0 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  LL..    **.    *
1c1f0 2a 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74  * As a test of t
1c200 68 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74  he fault simulat
1c210 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73  or mechanism its
1c220 65 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c  elf, sqlite3Faul
1c230 74 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69  tSim(0).    ** i
1c240 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61  s called immedia
1c250 74 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61  tely after insta
1c260 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61  lling the new ca
1c270 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72  llback and the r
1c280 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c  eturn.    ** val
1c290 75 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46  ue from sqlite3F
1c2a0 61 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d  aultSim(0) becom
1c2b0 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  es the return fr
1c2c0 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
1c2d0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29  3_test_control()
1c2e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1c2f0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1c300 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a  L_FAULT_INSTALL:
1c310 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43   {.      /* MSVC
1c320 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20   is picky about 
1c330 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72  pulling func ptr
1c340 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e  s from va lists.
1c350 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f  .      ** http:/
1c360 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f  /support.microso
1c370 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a  ft.com/kb/47961.
1c380 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
1c390 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
1c3a0 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
1c3b0 61 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69  arg(ap, int(*)(i
1c3c0 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  nt));.      */. 
1c3d0 20 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74       typedef int
1c3e0 28 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55  (*TESTCALLBACKFU
1c3f0 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20  NC_t)(int);.    
1c400 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1c410 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62  onfig.xTestCallb
1c420 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ack = va_arg(ap,
1c430 20 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e   TESTCALLBACKFUN
1c440 43 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  C_t);.      rc =
1c450 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1c460 28 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (0);.      break
1c470 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1c480 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1c490 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
1c4a0 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
1c4b0 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
1c4c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
1c4d0 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
1c4e0 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
1c4f0 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
1c500 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
1c510 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
1c520 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1c530 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
1c540 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
1c550 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
1c560 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
1c570 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
1c580 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
1c590 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
1c5a0 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
1c5b0 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
1c5c0 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
1c5d0 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
1c5e0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
1c5f0 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
1c600 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
1c610 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
1c620 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
1c630 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
1c640 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
1c650 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
1c660 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c670 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1c680 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1c690 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1c6a0 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
1c6b0 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
1c6c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1c6d0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1c6e0 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
1c6f0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
1c700 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
1c710 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
1c720 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
1c730 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1c740 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
1c750 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
1c760 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
1c770 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1c780 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1c790 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
1c7a0 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
1c7b0 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
1c7c0 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
1c7d0 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
1c7e0 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
1c7f0 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
1c800 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
1c810 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
1c820 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
1c830 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1c840 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
1c850 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
1c860 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69  .    ** deleteri
1c870 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
1c880 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c890 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
1c8a0 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
1c8b0 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47      rc = PENDING
1c8c0 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53  _BYTE;.#ifndef S
1c8d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
1c8e0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
1c8f0 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56  nsigned int newV
1c900 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
1c910 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
1c920 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61         if( newVa
1c930 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69  l ) sqlite3Pendi
1c940 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b  ngByte = newVal;
1c950 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1c960 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c970 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1c980 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1c990 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1c9a0 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
1c9b0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
1c9c0 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
1c9d0 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
1c9e0 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
1c9f0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
1ca00 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
1ca10 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
1ca20 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
1ca30 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
1ca40 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
1ca50 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
1ca60 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1ca70 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
1ca80 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
1ca90 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
1caa0 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
1cab0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1cac0 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
1cad0 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
1cae0 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
1caf0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1cb00 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
1cb10 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
1cb20 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
1cb30 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
1cb40 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
1cb50 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
1cb60 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
1cb70 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
1cb80 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1cb90 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1cba0 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
1cbb0 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
1cbc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cbd0 2f 2a 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f  /*side-effects-o
1cbe0 6b 2a 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28  k*/ (x = va_arg(
1cbf0 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20  ap,int))!=0 );. 
1cc00 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20       rc = x;.   
1cc10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cc20 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1cc30 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1cc40 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1cc50 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e  TCTRL_ALWAYS, in
1cc60 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1cc70 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
1cc80 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
1cc90 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68  me test to see h
1cca0 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e  ow the ALWAYS an
1ccb0 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d  d.    ** NEVER m
1ccc0 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e  acros were defin
1ccd0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1cce0 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  me..    **.    *
1ccf0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1cd00 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e  ue is ALWAYS(X).
1cd10 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
1cd20 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64   The recommended
1cd30 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20   test is X==2.  
1cd40 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
1cd50 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d  lue is 2, that m
1cd60 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41  eans.    ** ALWA
1cd70 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
1cd80 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20   are both no-op 
1cd90 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
1cda0 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68  ros, which is th
1cdb0 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
1cdc0 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68   setting.  If th
1cdd0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1cde0 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53  s 1, then ALWAYS
1cdf0 28 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20  () is either.   
1ce00 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74   ** hard-coded t
1ce10 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69  o true or else i
1ce20 74 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73  t asserts if its
1ce30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
1ce40 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  se..    ** The f
1ce50 69 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68  irst behavior (h
1ce60 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
1ce70 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
1ce80 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
1ce90 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
1cea0 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
1ceb0 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20  t() is disabled 
1cec0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  and the second. 
1ced0 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28     ** behavior (
1cee0 61 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72  assert if the ar
1cef0 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53  gument to ALWAYS
1cf00 28 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20  () is false) is 
1cf10 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
1cf20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
1cf30 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
1cf40 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
1cf50 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a   enabled..    **
1cf60 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d  .    ** The run-
1cf70 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64  time test proced
1cf80 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73  ure might look s
1cf90 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
1cfa0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
1cfb0 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  *    if( sqlite3
1cfc0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1cfd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1cfe0 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20  WAYS, 2)==2 ){. 
1cff0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1d000 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
1d010 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73  () are no-op pas
1d020 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
1d030 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
1d040 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
1d050 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1d060 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1d070 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20  , 1) ){.    **  
1d080 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29      // ALWAYS(x)
1d090 20 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20   asserts that x 
1d0a0 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78  is true. NEVER(x
1d0b0 29 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66  ) asserts x is f
1d0c0 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20  alse..    **    
1d0d0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20  }else{.    **   
1d0e0 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
1d0f0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e  is a constant 1.
1d100 20 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20    NEVER(x) is a 
1d110 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20  constant 0..    
1d120 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20  **    }.    */. 
1d130 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1d140 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20  ESTCTRL_ALWAYS: 
1d150 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
1d160 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1d170 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59        rc = ALWAY
1d180 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  S(x);.      brea
1d190 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d1a0 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  .    **   sqlite
1d1b0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1d1c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1d1d0 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a  YTEORDER);.    *
1d1e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74  *.    ** The int
1d1f0 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65  eger returned re
1d200 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f  veals the byte-o
1d210 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70  rder of the comp
1d220 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20  uter on which.  
1d230 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72    ** SQLite is r
1d240 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20  unning:.    **. 
1d250 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20     **       1   
1d260 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
1d270 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1d280 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1d290 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c      10     littl
1d2a0 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
1d2b0 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  ined at run-time
1d2c0 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20  .    **  432101 
1d2d0 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1d2e0 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1d2f0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1d300 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20    **  123410    
1d310 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
1d320 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
1d330 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
1d340 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  / .    case SQLI
1d350 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
1d360 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ORDER: {.      r
1d370 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  c = SQLITE_BYTEO
1d380 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54  RDER*100 + SQLIT
1d390 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31  E_LITTLEENDIAN*1
1d3a0 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e  0 + SQLITE_BIGEN
1d3b0 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61  DIAN;.      brea
1d3c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d3d0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1d3e0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d3f0 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
1d400 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1d410 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1d420 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65  ** Set the nRese
1d430 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f  rve size to N fo
1d440 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
1d450 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ase on the datab
1d460 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65  ase.    ** conne
1d470 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f  ction db..    */
1d480 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d490 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1d4a0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1d4b0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1d4c0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1d4d0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1d4e0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1d4f0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1d500 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1d510 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d520 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
1d530 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
1d540 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20   0, x, 0);.     
1d550 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d560 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1d570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d580 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1d590 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1d5a0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1d5b0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
1d5c0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1d5d0 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1d5e0 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1d5f0 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74  able various opt
1d600 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74  imizations for t
1d610 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
1d620 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72    The .    ** ar
1d630 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69  gument N is a bi
1d640 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
1d650 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ations to be dis
1d660 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d  abled.  For norm
1d670 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  al.    ** operat
1d680 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20  ion N should be 
1d690 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20  0.  The idea is 
1d6a0 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67  that a test prog
1d6b0 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20  ram (like the.  
1d6c0 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54    ** SQL Logic T
1d6d0 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20  est or SLT test 
1d6e0 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20  module) can run 
1d6f0 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c  the same SQL mul
1d700 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20  tiple times.    
1d710 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20  ** with various 
1d720 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69  optimizations di
1d730 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79  sabled to verify
1d740 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
1d750 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  nswer.    ** is 
1d760 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72  obtained in ever
1d770 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  y case..    */. 
1d780 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1d790 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
1d7a0 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73  TIONS: {.      s
1d7b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1d7c0 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1d7d0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f  );.      db->dbO
1d7e0 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28  ptFlags = (u16)(
1d7f0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20  va_arg(ap, int) 
1d800 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20  & 0xffff);.     
1d810 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
1d820 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b  ifdef SQLITE_N_K
1d830 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71  EYWORD.    /* sq
1d840 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d850 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d860 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f  RL_ISKEYWORD, co
1d870 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29  nst char *zWord)
1d880 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1d890 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79  f zWord is a key
1d8a0 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20  word recognized 
1d8b0 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  by the parser, t
1d8c0 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20  hen return the. 
1d8d0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
1d8e0 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66  keywords.  Or if
1d8f0 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20   zWord is not a 
1d900 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20  keyword, return 
1d910 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  0..    ** .    *
1d920 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74  * This test feat
1d930 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ure is only avai
1d940 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61  lable in the ama
1d950 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a  lgamation since.
1d960 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54      ** the SQLIT
1d970 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72  E_N_KEYWORD macr
1d980 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  o is not defined
1d990 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66   in this file if
1d9a0 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69   SQLite.    ** i
1d9b0 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65  s built using se
1d9c0 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69  parate source fi
1d9d0 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1d9e0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1d9f0 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20  CTRL_ISKEYWORD: 
1da00 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1da10 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61  ar *zWord = va_a
1da20 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
1da30 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r*);.      int n
1da40 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1da50 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20  30(zWord);.     
1da60 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65   rc = (sqlite3Ke
1da70 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a  ywordCode((u8*)z
1da80 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29  Word, n)!=TK_ID)
1da90 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57   ? SQLITE_N_KEYW
1daa0 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62  ORD : 0;.      b
1dab0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1dac0 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69  if ..    /* sqli
1dad0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1dae0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1daf0 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20  _SCRATCHMALLOC, 
1db00 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65  sz, &pNew, pFree
1db10 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1db20 20 50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f   Pass pFree into
1db30 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
1db40 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49  ree(). .    ** I
1db50 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f  f sz>0 then allo
1db60 63 61 74 65 20 61 20 73 63 72 61 74 63 68 20 62  cate a scratch b
1db70 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e  uffer into pNew.
1db80 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61    .    */.    ca
1db90 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1dba0 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43  RL_SCRATCHMALLOC
1dbb0 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  : {.      void *
1dbc0 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a  pFree, **ppNew;.
1dbd0 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20        int sz;.  
1dbe0 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28      sz = va_arg(
1dbf0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1dc00 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61  ppNew = va_arg(a
1dc10 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20  p, void**);.    
1dc20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67    pFree = va_arg
1dc30 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
1dc40 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e     if( sz ) *ppN
1dc50 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ew = sqlite3Scra
1dc60 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20  tchMalloc(sz);. 
1dc70 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 72 61       sqlite3Scra
1dc80 74 63 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a  tchFree(pFree);.
1dc90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dca0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1dcb0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1dcc0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1dcd0 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
1dce0 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20  T, int onoff);. 
1dcf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1dd00 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20  parameter onoff 
1dd10 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e  is non-zero, con
1dd20 66 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70  figure the wrapp
1dd30 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a  ers so that all.
1dd40 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e      ** subsequen
1dd50 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c  t calls to local
1dd60 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61  time() and varia
1dd70 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f  nts fail. If ono
1dd80 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20  ff is zero,.    
1dd90 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74  ** undo this set
1dda0 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ting..    */.   
1ddb0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1ddc0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
1ddd0 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73  FAULT: {.      s
1dde0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ddf0 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75  ig.bLocaltimeFau
1de00 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  lt = va_arg(ap, 
1de10 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1de20 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1de30 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1de40 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1de50 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
1de60 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20  RRUPT, int);.   
1de70 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f   **.    ** Set o
1de80 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74  r clear a flag t
1de90 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68  hat indicates th
1dea0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1deb0 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77  file is always w
1dec0 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d  ell-.    ** form
1ded0 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72  ed and never cor
1dee0 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67  rupt.  This flag
1def0 20 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66   is clear by def
1df00 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67  ault, indicating
1df10 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74   that.    ** dat
1df20 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68  abase files migh
1df30 74 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79  t have arbitrary
1df40 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65   corruption.  Se
1df50 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64  tting the flag d
1df60 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73  uring.    ** tes
1df70 74 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74  ting causes cert
1df80 61 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  ain assert() sta
1df90 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
1dfa0 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61  ode to be activa
1dfb0 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ted.    ** that 
1dfc0 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72  demonstrat invar
1dfd0 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f  iants on well-fo
1dfe0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
1dff0 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1e000 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e010 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
1e020 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  PT: {.      sqli
1e030 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e040 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76  neverCorrupt = v
1e050 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1e060 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e070 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71   }...    /*   sq
1e080 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1e090 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1e0a0 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  RL_VDBE_COVERAGE
1e0b0 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72  , xCallback, ptr
1e0c0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1e0d0 20 53 65 74 20 74 68 65 20 56 44 42 45 20 63 6f   Set the VDBE co
1e0e0 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20  verage callback 
1e0f0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c  function to xCal
1e100 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65  lback with conte
1e110 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  xt .    ** point
1e120 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20  er ptr..    */. 
1e130 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1e140 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56  ESTCTRL_VDBE_COV
1e150 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20  ERAGE: {.#ifdef 
1e160 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
1e170 52 41 47 45 0a 20 20 20 20 20 20 74 79 70 65 64  RAGE.      typed
1e180 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68  ef void (*branch
1e190 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  _callback)(void*
1e1a0 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20 20  ,int,u8,u8);.   
1e1b0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1e1c0 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61 6e  Config.xVdbeBran
1e1d0 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 62  ch = va_arg(ap,b
1e1e0 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b  ranch_callback);
1e1f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1e200 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65  obalConfig.pVdbe
1e210 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f 61  BranchArg = va_a
1e220 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65  rg(ap,void*);.#e
1e230 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
1e240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e250 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1e260 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1e270 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d  STCTRL_SORTER_MM
1e280 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20 2a  AP, db, nMax); *
1e290 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e2a0 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
1e2b0 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20  R_MMAP: {.      
1e2c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
1e2d0 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
1e2e0 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 4d  *);.      db->nM
1e2f0 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 76  axSorterMmap = v
1e300 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1e310 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e320 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1e330 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e340 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e350 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20 20 2a  L_ISINIT);.    *
1e360 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  *.    ** Return 
1e370 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51 4c  SQLITE_OK if SQL
1e380 69 74 65 20 68 61 73 20 62 65 65 6e 20 69 6e 69  ite has been ini
1e390 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53 51 4c  tialized and SQL
1e3a0 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20 20 20  ITE_ERROR if.   
1e3b0 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a   ** not..    */.
1e3c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e3d0 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 3a  TESTCTRL_ISINIT:
1e3e0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
1e3f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1e400 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72 63 20  .isInit==0 ) rc 
1e410 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1e420 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e430 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69   }..    /*  sqli
1e440 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e450 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e460 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 64  _IMPOSTER, db, d
1e470 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e  bName, onOff, tn
1e480 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  um);.    **.    
1e490 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e  ** This test con
1e4a0 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74 6f 20  trol is used to 
1e4b0 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20  create imposter 
1e4c0 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20 69 73  tables.  "db" is
1e4d0 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a   a pointer.    *
1e4e0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1e4f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 64  e connection.  d
1e500 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64 61 74  bName is the dat
1e510 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78 3a 20  abase name (ex: 
1e520 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a 2a  "main" or.    **
1e530 20 22 74 65 6d 70 22 29 20 77 68 69 63 68 20 77   "temp") which w
1e540 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68 65 20  ill receive the 
1e550 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f 66  imposter.  "onOf
1e560 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73 74 65  f" turns imposte
1e570 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a 2a  r mode on.    **
1e580 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d 22   or off.  "tnum"
1e590 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
1e5a0 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
1e5b0 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6d 70  to which the imp
1e5c0 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62  oster.    ** tab
1e5d0 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65 63  le should connec
1e5e0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
1e5f0 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65 72   Enable imposter
1e600 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e 20   mode only when 
1e610 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 61  the schema has a
1e620 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61 72 73  lready been pars
1e630 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a  ed.  Then.    **
1e640 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 43 52   run a single CR
1e650 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1e660 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75 63  ment to construc
1e670 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  t the imposter t
1e680 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20 74  able in.    ** t
1e690 68 65 20 70 61 72 73 65 64 20 73 63 68 65 6d 61  he parsed schema
1e6a0 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69 6d 70  .  Then turn imp
1e6b0 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63 6b 20  oster mode back 
1e6c0 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20 20 2a  off again..    *
1e6d0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f 66  *.    ** If onOf
1e6e0 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30 20  f==0 and tnum>0 
1e6f0 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 73  then reset the s
1e700 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64 61  chema for all da
1e710 74 61 62 61 73 65 73 2c 20 63 61 75 73 69 6e 67  tabases, causing
1e720 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65  .    ** the sche
1e730 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72 73 65  ma to be reparse
1e740 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
1e750 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20 20 54  it is needed.  T
1e760 68 69 73 20 68 61 73 20 74 68 65 0a 20 20 20 20  his has the.    
1e770 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65 72 61  ** effect of era
1e780 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74 65  sing all imposte
1e790 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f  r tables..    */
1e7a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e7b0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
1e7c0 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
1e7d0 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1e7e0 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1e7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1e800 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1e810 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  tex);.      db->
1e820 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c 69 74  init.iDb = sqlit
1e830 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
1e840 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73 74   va_arg(ap,const
1e850 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20   char*));.      
1e860 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20  db->init.busy = 
1e870 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
1e880 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72 67 28  rTable = va_arg(
1e890 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64  ap,int);.      d
1e8a0 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
1e8b0 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1e8c0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
1e8d0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26 20  init.busy==0 && 
1e8e0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1e8f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
1e900 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
1e910 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
1e920 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
1e930 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1e940 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1e950 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
1e960 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1e970 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20  end(ap);.#endif 
1e980 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
1e990 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20  UILTIN_TEST */. 
1e9a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e9b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
1e9c0 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20  tility routine, 
1e9d0 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d  useful to VFS im
1e9e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74  plementations, t
1e9f0 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f  hat checks.** to
1ea00 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61   see if a databa
1ea10 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52  se file was a UR
1ea20 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64  I that contained
1ea30 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72   a specific quer
1ea40 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c  y .** parameter,
1ea50 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69   and if so obtai
1ea60 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1ea70 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  the query parame
1ea80 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  ter..**.** The z
1ea90 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
1eaa0 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d  t is the filenam
1eab0 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64  e pointer passed
1eac0 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28   into the xOpen(
1ead0 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61  ).** method of a
1eae0 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1eaf0 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d  ion.  The zParam
1eb00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1eb10 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
1eb20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
1eb30 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72  we seek.  This r
1eb40 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1eb50 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1eb60 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65  zParam.** parame
1eb70 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73  ter if it exists
1eb80 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  .  If the parame
1eb90 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ter does not exi
1eba0 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
1ebb0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55  .** returns a NU
1ebc0 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63  LL pointer..*/.c
1ebd0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1ebe0 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
1ebf0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1ec00 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
1ec10 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69  ar *zParam){.  i
1ec20 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
1ec30 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72  || zParam==0 ) r
1ec40 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65  eturn 0;.  zFile
1ec50 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1ec60 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1ec70 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  e) + 1;.  while(
1ec80 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
1ec90 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72  .    int x = str
1eca0 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  cmp(zFilename, z
1ecb0 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c  Param);.    zFil
1ecc0 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
1ecd0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
1ece0 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  me) + 1;.    if(
1ecf0 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a   x==0 ) return z
1ed00 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46  Filename;.    zF
1ed10 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1ed20 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1ed30 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20  name) + 1;.  }. 
1ed40 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1ed50 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f  .** Return a boo
1ed60 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  lean value for a
1ed70 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1ed80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ed90 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e  _uri_boolean(con
1eda0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1edb0 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1edc0 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c  zParam, int bDfl
1edd0 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
1ede0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1edf0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1ee00 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1ee10 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21    bDflt = bDflt!
1ee20 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f  =0;.  return z ?
1ee30 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
1ee40 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62  an(z, bDflt) : b
1ee50 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
1ee60 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69  eturn a 64-bit i
1ee70 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
1ee80 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74   a query paramet
1ee90 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  er..*/.sqlite3_i
1eea0 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69  nt64 sqlite3_uri
1eeb0 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20  _int64(.  const 
1eec0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1eed0 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
1eee0 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70  as passed to xOp
1eef0 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  en */.  const ch
1ef00 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20  ar *zParam,     
1ef10 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74    /* URI paramet
1ef20 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73  er sought */.  s
1ef30 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66  qlite3_int64 bDf
1ef40 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  lt       /* retu
1ef50 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20  rn if parameter 
1ef60 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b  is missing */.){
1ef70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ef80 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1ef90 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1efa0 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73  me, zParam);.  s
1efb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a  qlite3_int64 v;.
1efc0 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74    if( z && sqlit
1efd0 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
1efe0 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f 4f  z, &v)==SQLITE_O
1eff0 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d  K ){.    bDflt =
1f000 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   v;.  }.  return
1f010 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   bDflt;.}../*.**
1f020 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72 65   Return the Btre
1f030 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69  e pointer identi
1f040 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e  fied by zDbName.
1f050 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1f060 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42   not found..*/.B
1f070 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e  tree *sqlite3DbN
1f080 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74  ameToBtree(sqlit
1f090 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
1f0a0 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
1f0b0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1f0c0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1f0d0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
1f0e0 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26  Db[i].pBt.     &
1f0f0 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c  & (zDbName==0 ||
1f100 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1f110 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  zDbName, db->aDb
1f120 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20  [i].zName)==0). 
1f130 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1f140 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  rn db->aDb[i].pB
1f150 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
1f160 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f170 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
1f180 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  ename of the dat
1f190 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
1f1a0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
1f1b0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
1f1c0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1f1d0 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
1f1e0 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
1f1f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1f200 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  ame){.  Btree *p
1f210 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Bt;.#ifdef SQLIT
1f220 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1f230 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1f240 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1f250 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
1f260 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1f270 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
1f280 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
1f290 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  Bt = sqlite3DbNa
1f2a0 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1f2b0 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  bName);.  return
1f2c0 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74   pBt ? sqlite3Bt
1f2d0 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70  reeGetFilename(p
1f2e0 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Bt) : 0;.}../*.*
1f2f0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64 61  * Return 1 if da
1f300 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f  tabase is read-o
1f310 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61 64  nly or 0 if read
1f320 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20  /write.  Return 
1f330 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  -1 if.** no such
1f340 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73   database exists
1f350 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f360 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c  _db_readonly(sql
1f370 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1f380 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1f390 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
1f3a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f3b0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1f3c0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1f3d0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1f3e0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1f3f0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1f400 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
1f410 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20  .#endif.  pBt = 
1f420 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1f430 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1f440 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
1f450 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ? sqlite3BtreeIs
1f460 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20  Readonly(pBt) : 
1f470 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  -1;.}..#ifdef SQ
1f480 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
1f490 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  SHOT./*.** Obtai
1f4a0 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e  n a snapshot han
1f4b0 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61 70  dle for the snap
1f4c0 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73 65  shot of database
1f4d0 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20 0a   zDb currently .
1f4e0 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62 79  ** being read by
1f4f0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
1f500 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  nt sqlite3_snaps
1f510 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69 74  hot_get(.  sqlit
1f520 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
1f530 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71   char *zDb,.  sq
1f540 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
1f550 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20  *ppSnapshot.){. 
1f560 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f570 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20  _ERROR;.#ifndef 
1f580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1f590 20 20 69 6e 74 20 69 44 62 3b 0a 0a 23 69 66 64    int iDb;..#ifd
1f5a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1f5b0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1f5c0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1f5d0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
1f5e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f5f0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
1f600 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1f610 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1f620 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 44 62  ->mutex);..  iDb
1f630 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
1f640 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
1f650 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
1f660 44 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65  Db>1 ){.    Btre
1f670 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
1f680 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
1f690 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
1f6a0 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
1f6b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f6c0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1f6d0 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20  Trans(pBt, 0);. 
1f6e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f6f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f710 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28 73  gerSnapshotGet(s
1f720 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1f730 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68 6f  (pBt), ppSnapsho
1f740 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1f750 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
1f760 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1f770 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
1f780 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
1f790 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
1f7a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
1f7b0 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
1f7c0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e 61  ction on the sna
1f7d0 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65 64  pshot idendified
1f7e0 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a 2a   by pSnapshot..*
1f7f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
1f800 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 73  apshot_open(.  s
1f810 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
1f820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
1f830 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
1f840 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a 29  hot *pSnapshot.)
1f850 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f860 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64  ITE_ERROR;.#ifnd
1f870 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1f880 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  AL..#ifdef SQLIT
1f890 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1f8a0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1f8b0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1f8c0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
1f8d0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1f8e0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
1f8f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f900 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1f910 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  ;.  if( db->auto
1f920 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f930 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69 44   int iDb;.    iD
1f940 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
1f950 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
1f960 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c      if( iDb==0 |
1f970 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20  | iDb>1 ){.     
1f980 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
1f990 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
1f9a0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
1f9b0 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
1f9c0 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  dTrans(pBt) ){. 
1f9d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f9e0 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
1f9f0 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65  Open(sqlite3Btre
1fa00 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 53 6e  ePager(pBt), pSn
1fa10 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20  apshot);.       
1fa20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fa30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1fa40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1fa50 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
1fa60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
1fa70 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
1fa80 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42  hotOpen(sqlite3B
1fa90 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
1faa0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
1fab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1fac0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1fad0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1fae0 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
1faf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
1fb00 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1fb10 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
1fb20 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f  napshot handle o
1fb30 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1fb40 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
1fb50 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  t()..*/.void sql
1fb60 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
1fb70 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  ee(sqlite3_snaps
1fb80 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b  hot *pSnapshot){
1fb90 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1fba0 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65  pSnapshot);.}.#e
1fbb0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1fbc0 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
1fbd0 2f 0a                                            /.