/ Hex Artifact Content
Login

Artifact a3be9a816c72fe658838e33e42afabfff93526f2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
1b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1b10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1b30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1b40: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b60: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1b70: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1b80: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1b90: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1ba0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1bb0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1bc0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1bd0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1be0: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1bf0: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1c00: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1c10: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1c20: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1c30: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1c40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c60: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1c70: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1c80: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1c90: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1ca0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1cb0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1cc0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1cd0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1ce0: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1cf0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1d00: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1d10: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1d20: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1d30: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1d40: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1d50: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1d60: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1d70: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1d80: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1d90: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1da0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1db0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1dc0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1dd0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1de0: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1df0: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1e00: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1e10: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1e20: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1e30: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1e40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1e50: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1e60: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1e70: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1e80: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1e90: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1ea0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1eb0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1ec0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1ed0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1ee0: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1ef0: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1f00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f10: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1f20: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1f30: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1f40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f50: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f70: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1f90: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1fa0: 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  ess = 1;.#ifdef 
1fb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
1fc0: 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20 20 20  LLOG.    {.     
1fd0: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
1fe0: 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67  ite3_init_sqllog
1ff0: 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 73 71  (void);.      sq
2000: 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f  lite3_init_sqllo
2010: 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  g();.    }.#endi
2020: 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71  f.    memset(&sq
2030: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
2040: 74 69 6f 6e 73 2c 20 30 2c 20 73 69 7a 65 6f 66  tions, 0, sizeof
2050: 28 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46  (sqlite3BuiltinF
2060: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
2070: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
2080: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
2090: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
20a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
20b0: 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29  sPCacheInit==0 )
20c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20d0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
20e0: 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20  lize();.    }.  
20f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2110: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2120: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2130: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
2140: 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20  lite3OsInit();. 
2150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2160: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2170: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
2180: 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71  eBufferSetup( sq
2190: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
21a0: 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20  g.pPage, .      
21b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
21c0: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20  lConfig.szPage, 
21d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
21e0: 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20  fig.nPage);.    
21f0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2200: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31  onfig.isInit = 1
2210: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2220: 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20 20  EXTRA_INIT.     
2230: 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d   bRunExtraInit =
2240: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
2250: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2260: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
2270: 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ess = 0;.  }.  s
2280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2290: 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ve(sqlite3Global
22a0: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
22b0: 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63  x);..  /* Go bac
22c0: 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74  k under the stat
22d0: 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65  ic mutex and cle
22e0: 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73  an up the recurs
22f0: 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74  ive.  ** mutex t
2300: 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f  o prevent a reso
2310: 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a  urce leak..  */.
2320: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2330: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
2340: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2350: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2360: 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c  tex--;.  if( sql
2370: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2380: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d  .nRefInitMutex<=
2390: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
23a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
23b0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
23c0: 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
23d0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
23e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
23f0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
2400: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2410: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
2420: 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tex = 0;.  }.  s
2430: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2440: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
2450: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2460: 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74   is just a sanit
2470: 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  y check to make 
2480: 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a  sure SQLite has.
2490: 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c    ** been compil
24a0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  ed correctly.  I
24b0: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
24c0: 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c  o run this code,
24d0: 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   but.  ** we don
24e0: 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69  't want to run i
24f0: 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20  t too often and 
2500: 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c  soak up CPU cycl
2510: 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72  es for no.  ** r
2520: 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75  eason.  So we ru
2530: 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67  n it once during
2540: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
2550: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
2560: 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c  EBUG.#ifndef SQL
2570: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
2580: 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69  G_POINT.  /* Thi
2590: 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64  s section of cod
25a0: 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74  e's only "output
25b0: 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28  " is via assert(
25c0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f  ) statements. */
25d0: 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49  .  if ( rc==SQLI
25e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34  TE_OK ){.    u64
25f0: 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c   x = (((u64)1)<<
2600: 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c  63)-1;.    doubl
2610: 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e y;.    assert(
2620: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20  sizeof(x)==8);. 
2630: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
2640: 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b  (x)==sizeof(y));
2650: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20  .    memcpy(&y, 
2660: 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65  &x, 8);.    asse
2670: 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  rt( sqlite3IsNaN
2680: 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (y) );.  }.#endi
2690: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  f.#endif..  /* D
26a0: 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  o extra initiali
26b0: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71  zation steps req
26c0: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51  uested by the SQ
26d0: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
26e0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
26f0: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  e option..  */.#
2700: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2710: 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52  RA_INIT.  if( bR
2720: 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20  unExtraInit ){. 
2730: 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58     int SQLITE_EX
2740: 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63  TRA_INIT(const c
2750: 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  har*);.    rc = 
2760: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2770: 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  T(0);.  }.#endif
2780: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2790: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65  ../*.** Undo the
27a0: 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69   effects of sqli
27b0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
27c0: 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63  .  Must not be c
27d0: 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74  alled while.** t
27e0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
27f0: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ding database co
2800: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
2810: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
2820: 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20  or.** while any 
2830: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69  part of SQLite i
2840: 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  s otherwise in u
2850: 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64  se in any thread
2860: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2870: 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  ne is not thread
2880: 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73  safe.  But it is
2890: 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20   safe to invoke 
28a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
28b0: 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  on when SQLite i
28c0: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
28d0: 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20  own.  If SQLite 
28e0: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
28f0: 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  down.** when thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
2910: 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  oked, then this 
2920: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2930: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2940: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
2950: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64  down(void){.#ifd
2960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2970: 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  SD.  int rc = sq
2980: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
2990: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
29a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
29c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
29d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
29e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a  onfig.isInit ){.
29f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2a00: 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20  TRA_SHUTDOWN.   
2a10: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54   void SQLITE_EXT
2a20: 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64  RA_SHUTDOWN(void
2a30: 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58  );.    SQLITE_EX
2a40: 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a  TRA_SHUTDOWN();.
2a50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2a60: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
2a70: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
2a80: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
2a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2aa0: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2ab0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2ac0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ad0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2ae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2af0: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2b00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b10: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2b20: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2b30: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2b40: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b50: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2b60: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
2b70: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b80: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b90: 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  Init = 0;..#ifnd
2ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2bb0: 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52  HUTDOWN_DIRECTOR
2bc0: 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68  IES.    /* The h
2bd0: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61  eap subsystem ha
2be0: 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64  s now been shutd
2bf0: 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61  own and these va
2c00: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2c10: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e  d.    ** to be N
2c20: 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20  ULL or point to 
2c30: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2c40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2c50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a  lite3_malloc(),.
2c60: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2c70: 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20  ld rely on that 
2c80: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20  heap subsystem; 
2c90: 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20  therefore, make 
2ca0: 73 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a  sure these.    *
2cb0: 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20  * values cannot 
2cc0: 72 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65  refer to heap me
2cd0: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75  mory that was ju
2ce0: 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  st invalidated w
2cf0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68  hen the.    ** h
2d00: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61  eap subsystem wa
2d10: 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  s shutdown.  Thi
2d20: 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69  s is only done i
2d30: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  f the current ca
2d40: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ll to.    ** thi
2d50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  s function resul
2d60: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20  ted in the heap 
2d70: 73 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c  subsystem actual
2d80: 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77  ly being shutdow
2d90: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  n..    */.    sq
2da0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2db0: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tory = 0;.    sq
2dc0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2dd0: 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tory = 0;.#endif
2de0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2e00: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2e10: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2e20: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2e30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2e40: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
2e50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2e60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e70: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
2e80: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
2e90: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
2ea0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
2eb0: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
2ec0: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
2ed0: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
2ee0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2ef0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
2f00: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2f10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
2f20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2f30: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2f40: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
2f50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2f60: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
2f70: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
2f80: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
2f90: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
2fa0: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
2fb0: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
2fc0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
2fd0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
2fe0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
2ff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
3000: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
3010: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
3020: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
3030: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
3040: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
3050: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
3060: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
3070: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3080: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
3090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
30a0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
30b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
30c0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
30d0: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
30e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
30f0: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
3100: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
3110: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
3120: 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23  ompile..    */.#
3130: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3140: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3150: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3160: 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  FE>0  /* IMP: R-
3170: 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20  54466-46756 */. 
3180: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3190: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
31a0: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AD: {.      /* E
31b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
31c0: 37 34 38 2d 31 39 30 39 36 20 54 68 69 73 20 6f  748-19096 This o
31d0: 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74  ption sets the t
31e0: 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f  hreading mode to
31f0: 0a 20 20 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65  .      ** Single
3200: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
3210: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3220: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3230: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3240: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
3250: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3260: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3270: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3280: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3290: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
32a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
32c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
32d0: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
32e0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
32f0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32 30   /* IMP: R-20520
3300: 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63 61  -54086 */.    ca
3310: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3320: 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a  _MULTITHREAD: {.
3330: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3340: 45 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d 34 32  E-OF: R-14374-42
3350: 34 36 38 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  468 This option 
3360: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3370: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3380: 20 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64   ** Multi-thread
3390: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
33a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33b0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20  CoreMutex = 1;  
33c0: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
33d0: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
33e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
33f0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
3400: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
3410: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
3420: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
3430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3440: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3450: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3460: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3470: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3480: 20 52 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a   R-59593-21810 *
3490: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
34a0: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
34b0: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
34c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
34d0: 31 32 32 30 2d 35 31 38 30 30 20 54 68 69 73 20  1220-51800 This 
34e0: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
34f0: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
3500: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 65 72 69 61  o.      ** Seria
3510: 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lized. */.      
3520: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3530: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
3540: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
3550: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3570: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
3580: 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e  utex = 1;  /* En
3590: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
35a0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
35b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
35c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
35d0: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
35e0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
35f0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3600: 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34 38 37  IMP: R-63666-487
3610: 35 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  55 */.    case S
3620: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
3630: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EX: {.      /* S
3640: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
3650: 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c  ative mutex impl
3660: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3670: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3680: 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20  lConfig.mutex = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
36b0: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
36c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
36d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
36e0: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
36f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3700: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  FE>0 /* IMP: R-1
3710: 34 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20  4450-37597 */.  
3720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3730: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
3740: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
3750: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
3760: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
3770: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
3780: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3790: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
37a0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
37b0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20  Config.mutex;.  
37c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
37e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
37f0: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
3800: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3810: 52 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68  R-55594-21030 Th
3820: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3830: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3840: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3850: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3860: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3870: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3880: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3890: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
38a0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
38b0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65  The argument spe
38c0: 63 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69  cifies alternati
38d0: 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d  ve.      ** low-
38e0: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
38f0: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3900: 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70   to be used in p
3910: 6c 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  lace of the memo
3920: 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ry.      ** allo
3930: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3940: 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74  built into SQLit
3950: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
3960: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3970: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3980: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3990: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
39a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
39b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
39c0: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
39d0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
39e0: 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31  OF: R-51213-4641
39f0: 34 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  4 The SQLITE_CON
3a00: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70  FIG_GETMALLOC op
3a10: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3a20: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3a30: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
3a40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3a50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
3a60: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
3a70: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3a80: 63 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74  cture. The sqlit
3a90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3aa0: 74 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20  tructure is.    
3ab0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
3ad0: 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c  efined memory al
3ae0: 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  location routine
3af0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  s. */.      if( 
3b00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3b10: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30  fig.m.xMalloc==0
3b20: 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74   ) sqlite3MemSet
3b30: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3b40: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3b50: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3b60: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3b70: 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20  alConfig.m;.    
3b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ba0: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
3bb0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3bc0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35  ENCE-OF: R-61275
3bd0: 2d 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54  -35157 The SQLIT
3be0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
3bf0: 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a  US option takes.
3c00: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3c10: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65  argument of type
3c20: 20 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65   int, interprete
3c30: 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20  d as a boolean, 
3c40: 77 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20  which enables.  
3c50: 20 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c      ** or disabl
3c60: 65 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f  es the collectio
3c70: 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  n of memory allo
3c80: 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  cation statistic
3c90: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
3ca0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3cb0: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
3cc0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ce0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3cf0: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b  ONFIG_SCRATCH: {
3d00: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3d10: 43 45 2d 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36  CE-OF: R-08404-6
3d20: 30 38 38 37 20 54 68 65 72 65 20 61 72 65 20 74  0887 There are t
3d30: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
3d40: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
3d50: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
3d60: 3a 20 41 20 70 6f 69 6e 74 65 72 20 61 6e 20 38  : A pointer an 8
3d70: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3d80: 6d 6f 72 79 20 62 75 66 66 65 72 20 66 72 6f 6d  mory buffer from
3d90: 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20  .      ** which 
3da0: 74 68 65 20 73 63 72 61 74 63 68 20 61 6c 6c 6f  the scratch allo
3db0: 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  cations will be 
3dc0: 64 72 61 77 6e 2c 20 74 68 65 20 73 69 7a 65 20  drawn, the size 
3dd0: 6f 66 20 65 61 63 68 20 73 63 72 61 74 63 68 0a  of each scratch.
3de0: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3df0: 69 6f 6e 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ion (sz), and th
3e00: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
3e10: 20 6f 66 20 73 63 72 61 74 63 68 20 61 6c 6c 6f   of scratch allo
3e20: 63 61 74 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a  cations (N). */.
3e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3e40: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
3e50: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
3e60: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3e70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3e80: 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61  g.szScratch = va
3e90: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3eb0: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
3ec0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3ed0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3ef0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3f00: 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  AGECACHE: {.    
3f10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3f20: 3a 20 52 2d 31 38 37 36 31 2d 33 36 36 30 31 20  : R-18761-36601 
3f30: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
3f40: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
3f50: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
3f60: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 41  FIG_PAGECACHE: A
3f70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 38 2d 62 79   pointer to 8-by
3f80: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3f90: 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20  y (pMem),.      
3fa0: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65  ** the size of e
3fb0: 61 63 68 20 70 61 67 65 20 63 61 63 68 65 20 6c  ach page cache l
3fc0: 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ine (sz), and th
3fd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
3fe0: 65 20 6c 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  e lines.      **
3ff0: 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73   (N). */.      s
4000: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4010: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
4020: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
4030: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4040: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
4050: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
4080: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4090: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
40a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
40c0: 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20  CACHE_HDRSZ: {. 
40d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
40e0: 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32 37 33  -OF: R-39100-273
40f0: 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  17 The SQLITE_CO
4100: 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53  NFIG_PCACHE_HDRS
4110: 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  Z option takes. 
4120: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
4130: 20 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68   parameter which
4140: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4150: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
4160: 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20 20 20  writes into.    
4170: 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65    ** that intege
4180: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
4190: 65 78 74 72 61 20 62 79 74 65 73 20 70 65 72 20  extra bytes per 
41a0: 70 61 67 65 20 72 65 71 75 69 72 65 64 20 66 6f  page required fo
41b0: 72 20 65 61 63 68 20 70 61 67 65 0a 20 20 20 20  r each page.    
41c0: 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43    ** in SQLITE_C
41d0: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e  ONFIG_PAGECACHE.
41e0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
41f0: 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20  g(ap, int*) = . 
4200: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4210: 48 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28  HeaderSizeBtree(
4220: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
4230: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4240: 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20 20 20  cache() +.      
4250: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4260: 72 53 69 7a 65 50 63 61 63 68 65 31 28 29 3b 0a  rSizePcache1();.
4270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4280: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4290: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
42a0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
42b0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
42d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
42e0: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
42f0: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
4300: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
4310: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
4320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4330: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4340: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
4350: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  E2: {.      /* E
4360: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
4370: 33 32 35 2d 34 38 33 37 38 20 54 68 65 20 53 51  325-48378 The SQ
4380: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
4390: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
43a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
43b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
43c0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
43d0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
43e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
43f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68     ** object. Th
4400: 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63 69 66  is object specif
4410: 69 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63  ies the interfac
4420: 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20 70 61  e to a custom pa
4430: 67 65 20 63 61 63 68 65 0a 20 20 20 20 20 20 2a  ge cache.      *
4440: 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
4450: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
4460: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4470: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
4480: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
4490: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
44a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
44c0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
44d0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
44e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
44f0: 32 32 30 33 35 2d 34 36 31 38 32 20 54 68 65 20  22035-46182 The 
4500: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4510: 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20  TPCACHE2 option 
4520: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
4530: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4540: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
4550: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
4560: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4570: 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  2.      ** objec
4580: 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73  t. SQLite copies
4590: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
45a0: 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65  page cache imple
45b0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20  mentation into. 
45c0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a       ** that obj
45d0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ect. */.      if
45e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
45f0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
4600: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
4610: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
4620: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
4630: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
4640: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
4650: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
4660: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
4670: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
4680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4690: 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d   }../* EVIDENCE-
46a0: 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32 39 31  OF: R-06626-1291
46b0: 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  1 The SQLITE_CON
46c0: 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20  FIG_HEAP option 
46d0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  is only.** avail
46e0: 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69  able if SQLite i
46f0: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
4700: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 45 4e  either SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a  ABLE_MEMSYS3 or.
4720: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
4730: 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72 65 74  _MEMSYS5 and ret
4740: 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f  urns SQLITE_ERRO
4750: 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68  R if invoked oth
4760: 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64  erwise. */.#if d
4770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4780: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
4790: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
47a0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
47b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
47c0: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
47d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
47e0: 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34 32 31  -OF: R-19854-421
47f0: 32 36 20 54 68 65 72 65 20 61 72 65 20 74 68 72  26 There are thr
4800: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
4810: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4820: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41 6e 20  CONFIG_HEAP: An 
4830: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 70  8-byte aligned p
4840: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65  ointer to the me
4850: 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20 20 20  mory, the.      
4860: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
4870: 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79  es in the memory
4880: 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74 68 65   buffer, and the
4890: 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   minimum allocat
48a0: 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20 20 20  ion size..      
48b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
48c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
48d0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
48e0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
48f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4900: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
4910: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4930: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
4940: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
4950: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4960: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4970: 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eq<1 ){.        
4980: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4990: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20  fig.mnReq = 1;. 
49a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
49b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
49c0: 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29  ig.mnReq>(1<<12)
49d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
49e0: 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73  ap min request s
49f0: 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20  ize at 2^12 */. 
4a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
4a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
4a20: 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20   = (1<<12);.    
4a30: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
4a40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4a50: 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
4a60: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
4a70: 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36  CE-OF: R-49920-6
4a80: 30 31 38 39 20 49 66 20 74 68 65 20 66 69 72 73  0189 If the firs
4a90: 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d  t pointer (the m
4aa0: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 0a 20  emory pointer). 
4ab0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c         ** is NUL
4ac0: 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 72  L, then SQLite r
4ad0: 65 76 65 72 74 73 20 74 6f 20 75 73 69 6e 67 20  everts to using 
4ae0: 69 74 73 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  its default memo
4af0: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20  ry allocator.   
4b00: 20 20 20 20 20 2a 2a 20 28 74 68 65 20 73 79 73       ** (the sys
4b10: 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70  tem malloc() imp
4b20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e  lementation), un
4b30: 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f 72 20  doing any prior 
4b40: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20  invocation of.  
4b50: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4b60: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20  CONFIG_MALLOC.. 
4b70: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4b80: 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 73 71 6c    ** Setting sql
4b90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4ba0: 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20  .m to all zeros 
4bb0: 77 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f  will cause mallo
4bc0: 63 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  c to.        ** 
4bd0: 72 65 76 65 72 74 20 74 6f 20 69 74 73 20 64 65  revert to its de
4be0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
4bf0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
4c00: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
4c10: 73 20 72 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f  s run.        */
4c20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
4c30: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
4c40: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
4c50: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
4c60: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
4c70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4c80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4c90: 52 2d 36 31 30 30 36 2d 30 38 39 31 38 20 49 66  R-61006-08918 If
4ca0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e   the memory poin
4cb0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
4cc0: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
4cd0: 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20   ** alternative 
4ce0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4cf0: 20 69 73 20 65 6e 67 61 67 65 64 20 74 6f 20 68   is engaged to h
4d00: 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c  andle all of SQL
4d10: 69 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ites.        ** 
4d20: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4d30: 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64  n needs. */.#ifd
4d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d50: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
4d60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4d70: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4d80: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
4d90: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4da0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4db0: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
4dc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4dd0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4de0: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
4df0: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
4e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e10: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
4e20: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4e30: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
4e40: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4e50: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
4e60: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
4e70: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4e90: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
4ea0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ec0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
4ed0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
4ee0: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
4ef0: 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72  tion and its fir
4f00: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
4f10: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
4f20: 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e  is NULL.  Loggin
4f30: 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66  g is disabled if
4f40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f   the function po
4f50: 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  inter is.    ** 
4f60: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
4f70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4f80: 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  FIG_LOG: {.     
4f90: 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
4fa0: 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
4fb0: 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
4fc0: 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
4fd0: 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
4fe0: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
4ff0: 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
5000: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5010: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
5020: 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76  rg(ap, void(*)(v
5030: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
5040: 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f  har*));.      */
5050: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
5060: 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28  oid(*LOGFUNC_t)(
5070: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
5080: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
5090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
50a0: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
50b0: 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a  ap, LOGFUNC_t);.
50c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72  balConfig.pLogAr
50e0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
50f0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  oid*);.      bre
5100: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5110: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5120: 2d 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65  -55548-33817 The
5130: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65   compile-time se
5140: 74 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69  tting for URI fi
5150: 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63  lenames.    ** c
5160: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74  an be changed at
5170: 20 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e   start-time usin
5180: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  g the.    ** sql
5190: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
51a0: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29  TE_CONFIG_URI,1)
51b0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
51c0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
51d0: 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63  _CONFIG_URI,0) c
51e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c  onfiguration cal
51f0: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
5200: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5210: 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f  G_URI: {.      /
5220: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5230: 2d 32 35 34 35 31 2d 36 31 31 32 35 20 54 68 65  -25451-61125 The
5240: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5250: 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  RI option takes 
5260: 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a  a single.      *
5270: 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  * argument of ty
5280: 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a  pe int. If non-z
5290: 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61  ero, then URI ha
52a0: 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c  ndling is global
52b0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  ly.      ** enab
52c0: 6c 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61  led. If the para
52d0: 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  meter is zero, t
52e0: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
52f0: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5300: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20     ** disabled. 
5310: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5320: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
5330: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
5340: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
5350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5360: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5370: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
5380: 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20  EX_SCAN: {.     
5390: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
53a0: 20 52 2d 33 36 35 39 32 2d 30 32 37 37 32 20 54   R-36592-02772 T
53b0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
53c0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53d0: 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70  SCAN.      ** op
53e0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
53f0: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
5400: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6e  ment which is in
5410: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 20  terpreted as a. 
5420: 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20       ** boolean 
5430: 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 61 62  in order to enab
5440: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
5450: 65 20 75 73 65 20 6f 66 20 63 6f 76 65 72 69 6e  e use of coverin
5460: 67 20 69 6e 64 69 63 65 73 20 66 6f 72 0a 20 20  g indices for.  
5470: 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c      ** full tabl
5480: 65 20 73 63 61 6e 73 20 69 6e 20 74 68 65 20 71  e scans in the q
5490: 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20  uery optimizer. 
54a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
54b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
54c0: 65 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70  eCis = va_arg(ap
54d0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
54e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
54f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5500: 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65  _SQLLOG.    case
5510: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
5520: 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74  QLLOG: {.      t
5530: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c  ypedef void(*SQL
5540: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5550: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
5560: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20  t char*, int);. 
5570: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5580: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
5590: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51   = va_arg(ap, SQ
55a0: 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20  LLOGFUNC_t);.   
55b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
55c0: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
55d0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
55e0: 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72  oid *);.      br
55f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5600: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
5610: 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53  TE_CONFIG_MMAP_S
5620: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IZE: {.      /* 
5630: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5640: 38 30 36 33 2d 33 38 32 35 38 20 53 51 4c 49 54  8063-38258 SQLIT
5650: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
5660: 5a 45 20 74 61 6b 65 73 20 74 77 6f 20 36 34 2d  ZE takes two 64-
5670: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  bit.      ** int
5680: 65 67 65 72 20 28 73 71 6c 69 74 65 33 5f 69 6e  eger (sqlite3_in
5690: 74 36 34 29 20 76 61 6c 75 65 73 20 74 68 61 74  t64) values that
56a0: 20 61 72 65 20 74 68 65 20 64 65 66 61 75 6c 74   are the default
56b0: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
56c0: 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 64  .      ** (the d
56d0: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 66  efault setting f
56e0: 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73  or PRAGMA mmap_s
56f0: 69 7a 65 29 20 61 6e 64 20 74 68 65 20 6d 61 78  ize) and the max
5700: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20  imum allowed.   
5710: 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20     ** mmap size 
5720: 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  limit. */.      
5730: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
5740: 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
5750: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
5760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5770: 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76  int64 mxMmap = v
5780: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
5790: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
57a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
57b0: 52 2d 35 33 33 36 37 2d 34 33 31 39 30 20 49 66  R-53367-43190 If
57c0: 20 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74   either argument
57d0: 20 74 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   to this option 
57e0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65 67 61  is.      ** nega
57f0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 61 74 20  tive, then that 
5800: 61 72 67 75 6d 65 6e 74 20 69 73 20 63 68 61 6e  argument is chan
5810: 67 65 64 20 74 6f 20 69 74 73 20 63 6f 6d 70 69  ged to its compi
5820: 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c 74 2e  le-time default.
5830: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5840: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
5850: 52 2d 33 34 39 39 33 2d 34 35 30 33 31 20 54 68  R-34993-45031 Th
5860: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5870: 64 20 6d 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c  d mmap size will
5880: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c   be.      ** sil
5890: 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 20  ently truncated 
58a0: 69 66 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  if necessary so 
58b0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
58c0: 20 65 78 63 65 65 64 20 74 68 65 0a 20 20 20 20   exceed the.    
58d0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
58e0: 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  e maximum mmap s
58f0: 69 7a 65 20 73 65 74 20 62 79 20 74 68 65 20 53  ize set by the S
5900: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
5910: 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  IZE.      ** com
5920: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
5930: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5940: 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c   if( mxMmap<0 ||
5950: 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d   mxMmap>SQLITE_M
5960: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a  AX_MMAP_SIZE ){.
5970: 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d          mxMmap =
5980: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
5990: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _SIZE;.      }. 
59a0: 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c       if( szMmap<
59b0: 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  0 ) szMmap = SQL
59c0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
59d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28  _SIZE;.      if(
59e0: 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20   szMmap>mxMmap) 
59f0: 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b  szMmap = mxMmap;
5a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
5a20: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a40: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73  onfig.szMmap = s
5a50: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65  zMmap;.      bre
5a60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53  ak;.    }..#if S
5a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20  QLITE_OS_WIN && 
5a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5a90: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20  IN32_MALLOC) /* 
5aa0: 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35 35 38  IMP: R-04780-558
5ab0: 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  15 */.    case S
5ac0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
5ad0: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
5ae0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5af0: 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30 33 33  -OF: R-34926-033
5b00: 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  60 SQLITE_CONFIG
5b10: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 20  _WIN32_HEAPSIZE 
5b20: 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74 0a 20  takes a 32-bit. 
5b30: 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64       ** unsigned
5b40: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74   integer value t
5b50: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
5b60: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
5b70: 66 20 74 68 65 20 63 72 65 61 74 65 64 0a 20 20  f the created.  
5b80: 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a      ** heap. */.
5b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5ba0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
5bb0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5bc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5bd0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5bf0: 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20  NFIG_PMASZ: {.  
5c00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5c10: 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20  lConfig.szPma = 
5c20: 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
5c30: 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
5c40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5c50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5c60: 4e 46 49 47 5f 53 54 4d 54 4a 52 4e 4c 5f 53 50  NFIG_STMTJRNL_SP
5c70: 49 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILL: {.      sql
5c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5c90: 2e 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 76 61  .nStmtSpill = va
5ca0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cc0: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
5cd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5ce0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
5cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5d00: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
5d10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5d20: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
5d30: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5d40: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
5d50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
5d60: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d70: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
5d80: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
5d90: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
5da0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
5db0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
5dc0: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
5dd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5de0: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
5df0: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
5e00: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
5e10: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5e20: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
5e30: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
5e40: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
5e50: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
5e60: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
5e70: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
5e80: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
5e90: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
5ea0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
5eb0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
5ec0: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
5ed0: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
5ee0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
5ef0: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
5f00: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
5f10: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
5f20: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66  z, int cnt){.#if
5f30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5f40: 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69  _LOOKASIDE.  voi
5f50: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
5f60: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
5f70: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
5f80: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
5f90: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
5fa0: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
5fb0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
5fc0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
5fd0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
5fe0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
5ff0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
6000: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
6010: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
6020: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
6030: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6040: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6050: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6060: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6070: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6080: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
6090: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
60a0: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
60b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
60c0: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
60d0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
60e0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
60f0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
6100: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
6110: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
6120: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
6130: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
6140: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
6150: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
6160: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
6170: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
6180: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
6190: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
61a0: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
61b0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
61c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
61d0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
61e0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
61f0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
6200: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
6210: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
6220: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
6230: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
6240: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6250: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
6260: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6270: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
6280: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
6290: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
62a0: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
62b0: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
62c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
62d0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
62e0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
62f0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
6300: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
6310: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
6320: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6330: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
6340: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
6350: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
6360: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
6370: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
6380: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
6390: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
63a0: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
63b0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
63c0: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
63d0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
63e0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
63f0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6400: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
6410: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
6420: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
6430: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6440: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
6450: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
6460: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6470: 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20  .pStart = db;.  
6480: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6490: 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64  pEnd = db;.    d
64a0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
64b0: 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 64  sable = 1;.    d
64c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
64d0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
64e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
64f0: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20  _OMIT_LOOKASIDE 
6500: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
6510: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6520: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
6530: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6540: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
6550: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
6560: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
6570: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
6580: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
6590: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
65a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
65b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
65c0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
65d0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
65e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
65f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
6600: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  f.  return db->m
6610: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
6620: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
6630: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
6640: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
6650: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
6660: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
6670: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
6680: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
6690: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  *db){.  int i;..
66a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
66b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
66c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
66d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
66e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
66f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6700: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6710: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6720: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6730: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6750: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6760: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6770: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6780: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
6790: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
67a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
67b0: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
67c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
67d0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
67e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
67f0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6810: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6820: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
6830: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6840: 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74  * Flush any dirt
6850: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
6860: 61 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61  ager-cache for a
6870: 6e 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ny attached data
6880: 62 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e  base.** to disk.
6890: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
68a0: 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71  db_cacheflush(sq
68b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
68c0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
68d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
68e0: 20 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a   bSeenBusy = 0;.
68f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6900: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6910: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6920: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6930: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6940: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
6950: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
6960: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6970: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
6980: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
6990: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
69a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
69b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
69c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
69d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
69e0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
69f0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
6a00: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
6a10: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
6a20: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
6a30: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
6a40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6a50: 65 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b  erFlush(pPager);
6a60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6a70: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
6a80: 20 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20        bSeenBusy 
6a90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
6aa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6ab0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6ac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6ad0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6ae0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6af0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6b00: 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
6b10: 54 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75  TE_OK && bSeenBu
6b20: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
6b30: 59 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Y : rc);.}../*.*
6b40: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
6b50: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
6b60: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
6b70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
6b80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6b90: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
6ba0: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
6bb0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6bc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
6bd0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
6be0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
6bf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6c00: 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  BCONFIG_LOOKASID
6c10: 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  E: {.      void 
6c20: 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61  *pBuf = va_arg(a
6c30: 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d  p, void*); /* IM
6c40: 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34  P: R-26835-10964
6c50: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
6c60: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6c70: 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50  t);       /* IMP
6c80: 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20  : R-47871-25994 
6c90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
6ca0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6cb0: 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  t);      /* IMP:
6cc0: 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a   R-04460-53386 *
6cd0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74  /.      rc = set
6ce0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
6cf0: 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a  pBuf, sz, cnt);.
6d00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d10: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6d20: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
6d30: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
6d40: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
6d50: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6d60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
6d70: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b  mask;    /* Mask
6d80: 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73   of the bit in s
6d90: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20  qlite3.flags to 
6da0: 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20  set/clear */.   
6db0: 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d     } aFlagOp[] =
6dc0: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c   {.        { SQL
6dd0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
6de0: 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 20 20 20  BLE_FKEY,       
6df0: 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69      SQLITE_Forei
6e00: 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20  gnKeys    },.   
6e10: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
6e20: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
6e30: 49 47 47 45 52 2c 20 20 20 20 20 20 20 20 53 51  IGGER,        SQ
6e40: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
6e50: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  er  },.        {
6e60: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
6e70: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
6e80: 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46  ENIZER, SQLITE_F
6e90: 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c  ts3Tokenizer  },
6ea0: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6eb0: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6ec0: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
6ed0: 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  , SQLITE_LoadExt
6ee0: 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  ension  },.     
6ef0: 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   };.      unsign
6f00: 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20  ed int i;.      
6f10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
6f20: 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37  R; /* IMP: R-427
6f30: 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20  90-23372 */.    
6f40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
6f50: 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b  aySize(aFlagOp);
6f60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
6f70: 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70  f( aFlagOp[i].op
6f80: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ==op ){.        
6f90: 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61    int onoff = va
6fa0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
6fb0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52           int *pR
6fc0: 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  es = va_arg(ap, 
6fd0: 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20  int*);.         
6fe0: 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20   int oldFlags = 
6ff0: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  db->flags;.     
7000: 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30       if( onoff>0
7010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7020: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c  db->flags |= aFl
7030: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
7040: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7050: 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20  ( onoff==0 ){.  
7060: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
7070: 61 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b  ags &= ~aFlagOp[
7080: 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  i].mask;.       
7090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
70a0: 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d  f( oldFlags!=db-
70b0: 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  >flags ){.      
70c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
70d0: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
70e0: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  ments(db);.     
70f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7100: 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20   if( pRes ){.   
7110: 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
7120: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46   (db->flags & aF
7130: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d  lagOp[i].mask)!=
7140: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
7150: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
7160: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
7170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7180: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
71a0: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
71b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
71c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
71d0: 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65  rue if the buffe
71e0: 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74  r z[0..n-1] cont
71f0: 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e  ains all spaces.
7200: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
7210: 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63  llSpaces(const c
7220: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
7230: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
7240: 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e  z[n-1]==' ' ){ n
7250: 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  --; }.  return n
7260: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
7270: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
7280: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
7290: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
72a0: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
72b0: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
72c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
72d0: 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  adFlag argument 
72e0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
72f0: 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61   space padding a
7300: 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  t the end.** of 
7310: 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72  strings is ignor
7320: 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ed.  This implem
7330: 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63  ents the RTRIM c
7340: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ollation..*/.sta
7350: 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46  tic int binCollF
7360: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64  unc(.  void *pad
7370: 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Flag,.  int nKey
7380: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7390: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
73a0: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
73b0: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
73c0: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
73d0: 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
73e0: 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49   nKey2;.  /* EVI
73f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33  DENCE-OF: R-6503
7400: 33 2d 32 38 34 34 39 20 54 68 65 20 62 75 69 6c  3-28449 The buil
7410: 74 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c  t-in BINARY coll
7420: 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20  ation compares. 
7430: 20 2a 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65   ** strings byte
7440: 20 62 79 20 62 79 74 65 20 75 73 69 6e 67 20 74   by byte using t
7450: 68 65 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63  he memcmp() func
7460: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74  tion from the st
7470: 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69  andard C.  ** li
7480: 62 72 61 72 79 2e 20 2a 2f 0a 20 20 72 63 20 3d  brary. */.  rc =
7490: 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
74a0: 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
74b0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
74c0: 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26   padFlag.     &&
74d0: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
74e0: 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65  r*)pKey1)+n, nKe
74f0: 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c  y1-n).     && al
7500: 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29  lSpaces(((char*)
7510: 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d  pKey2)+n, nKey2-
7520: 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
7530: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7540: 52 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52 54  R-31624-24737 RT
7550: 52 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e 41  RIM is like BINA
7560: 52 59 20 65 78 63 65 70 74 20 74 68 61 74 20 65  RY except that e
7570: 78 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73 70  xtra.      ** sp
7580: 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 20  aces at the end 
7590: 6f 66 20 65 69 74 68 65 72 20 73 74 72 69 6e 67  of either string
75a0: 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
75b0: 68 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74  he result. In ot
75c0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72  her.      ** wor
75d0: 64 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c 6c  ds, strings will
75e0: 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
75f0: 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61 73  o one another as
7600: 20 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20 20   long as they.  
7610: 20 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e      ** differ on
7620: 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ly in the number
7630: 20 6f 66 20 73 70 61 63 65 73 20 61 74 20 74 68   of spaces at th
7640: 65 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  e end..      */.
7650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7660: 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b   rc = nKey1 - nK
7670: 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ey2;.    }.  }. 
7680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7690: 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69  *.** Another bui
76a0: 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20  lt-in collating 
76b0: 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45  sequence: NOCASE
76c0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  . .**.** This co
76d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
76e0: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
76f0: 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73  be used for "cas
7700: 65 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a  e independent.**
7710: 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51   comparison". SQ
7720: 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65  Lite's knowledge
7730: 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   of upper and lo
7740: 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c  wer case equival
7750: 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20  ents.** extends 
7760: 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63  only to the 26 c
7770: 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69  haracters used i
7780: 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61  n the English la
7790: 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74  nguage..**.** At
77a0: 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72   the moment ther
77b0: 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d  e is only a UTF-
77c0: 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  8 implementation
77d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
77e0: 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
77f0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
7800: 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
7810: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7820: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
7830: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
7840: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20  Key2.){.  int r 
7850: 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  = sqlite3StrNICm
7860: 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20  p(.      (const 
7870: 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63  char *)pKey1, (c
7880: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79  onst char *)pKey
7890: 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29  2, (nKey1<nKey2)
78a0: 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20  ?nKey1:nKey2);. 
78b0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
78c0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  R(NotUsed);.  if
78d0: 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20  ( 0==r ){.    r 
78e0: 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20  = nKey1-nKey2;. 
78f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
7900: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7910: 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  he ROWID of the 
7920: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
7930: 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74  rt.*/.sqlite_int
7940: 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  64 sqlite3_last_
7950: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c  insert_rowid(sql
7960: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
7970: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7980: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7990: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
79a0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
79b0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
79c0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
79d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
79e0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
79f0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  >lastRowid;.}../
7a00: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7a10: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
7a20: 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  s in the most re
7a30: 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
7a40: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a  ite3_exec()..*/.
7a50: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  int sqlite3_chan
7a60: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
7a70: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
7a80: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
7a90: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
7aa0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
7ab0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
7ac0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
7ad0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7ae0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
7af0: 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b  urn db->nChange;
7b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7b10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
7b20: 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65  hanges since the
7b30: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7b40: 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a   was opened..*/.
7b50: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  int sqlite3_tota
7b60: 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  l_changes(sqlite
7b70: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7b80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
7b90: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
7ba0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
7bb0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
7bc0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
7bd0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
7be0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7bf0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54  .  return db->nT
7c00: 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  otalChange;.}../
7c10: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f  *.** Close all o
7c20: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
7c30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  This function on
7c40: 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66  ly manipulates f
7c50: 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20  ields of the.** 
7c60: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7c70: 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20  object, it does 
7c80: 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61  not close any sa
7c90: 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61  vepoints that ma
7ca0: 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20  y be open.** at 
7cb0: 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72  the b-tree/pager
7cc0: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20   level..*/.void 
7cd0: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
7ce0: 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  points(sqlite3 *
7cf0: 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62  db){.  while( db
7d00: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->pSavepoint ){.
7d10: 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70      Savepoint *p
7d20: 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  Tmp = db->pSavep
7d30: 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53  oint;.    db->pS
7d40: 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d  avepoint = pTmp-
7d50: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
7d60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
7d70: 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e  mp);.  }.  db->n
7d80: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
7d90: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
7da0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61  = 0;.  db->isTra
7db0: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
7dc0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
7dd0: 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  Invoke the destr
7de0: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61  uctor function a
7df0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46  ssociated with F
7e00: 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79  uncDef p, if any
7e10: 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20  . Except,.** if 
7e20: 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
7e30: 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65  last copy of the
7e40: 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f   function, do no
7e50: 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c  t invoke it. Mul
7e60: 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20  tiple.** copies 
7e70: 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63  of a single func
7e80: 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64  tion are created
7e90: 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e   when create_fun
7ea0: 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65  ction() is calle
7eb0: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
7ec0: 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f  _ANY as the enco
7ed0: 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ding..*/.static 
7ee0: 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73  void functionDes
7ef0: 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62  troy(sqlite3 *db
7f00: 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20  , FuncDef *p){. 
7f10: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
7f20: 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  *pDestructor = p
7f30: 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 3b  ->u.pDestructor;
7f40: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
7f50: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
7f60: 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  uctor->nRef--;. 
7f70: 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74     if( pDestruct
7f80: 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  or->nRef==0 ){. 
7f90: 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72       pDestructor
7fa0: 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74  ->xDestroy(pDest
7fb0: 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74  ructor->pUserDat
7fc0: 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
7fd0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73  3DbFree(db, pDes
7fe0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
7ff0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73    }.}../*.** Dis
8000: 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69  connect all sqli
8010: 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73  te3_vtab objects
8020: 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
8030: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8040: 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20  ion.** db. This 
8050: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64  is called when d
8060: 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65  b is being close
8070: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8080: 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  d disconnectAllV
8090: 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tab(sqlite3 *db)
80a0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
80b0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
80c0: 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61  LE.  int i;.  Ha
80d0: 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c  shElem *p;.  sql
80e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
80f0: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
8100: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
8110: 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ){.    Schema *p
8120: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
8130: 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [i].pSchema;.   
8140: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
8150: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
8160: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
8170: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
8180: 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d  >tblHash); p; p=
8190: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
81a0: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
81b0: 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65  e *pTab = (Table
81c0: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
81d0: 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  a(p);.        if
81e0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
81f0: 29 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44  ) ) sqlite3VtabD
8200: 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54  isconnect(db, pT
8210: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
8220: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73   }.  }.  for(p=s
8230: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
8240: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b  db->aModule); p;
8250: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
8260: 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(p)){.    Modul
8270: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
8280: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
8290: 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(p);.    if( p
82a0: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a  Mod->pEpoTab ){.
82b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
82c0: 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  bDisconnect(db, 
82d0: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a  pMod->pEpoTab);.
82e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
82f0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
8300: 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  t(db);.  sqlite3
8310: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
8320: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
8330: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
8340: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
8350: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
8360: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8370: 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e  ion db has unfin
8380: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
8390: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
83a0: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
83b0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
83c0: 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ts.  .*/.static 
83d0: 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73  int connectionIs
83e0: 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62  Busy(sqlite3 *db
83f0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
8400: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8410: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
8420: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ex) );.  if( db-
8430: 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20  >pVdbe ) return 
8440: 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  1;.  for(j=0; j<
8450: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
8460: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8470: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a  db->aDb[j].pBt;.
8480: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
8490: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42  qlite3BtreeIsInB
84a0: 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74  ackup(pBt) ) ret
84b0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
84c0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
84d0: 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Close an existin
84e0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
84f0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
8500: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c  sqlite3Close(sql
8510: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f  ite3 *db, int fo
8520: 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66  rceZombie){.  if
8530: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20  ( !db ){.    /* 
8540: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
8550: 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c 69  3257-11740 Calli
8560: 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  ng sqlite3_close
8570: 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  () or.    ** sql
8580: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20  ite3_close_v2() 
8590: 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  with a NULL poin
85a0: 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ter argument is 
85b0: 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
85c0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
85d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
85e0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
85f0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
8600: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
8610: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
8620: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
8630: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8640: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
8650: 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 20  f( db->mTrace & 
8660: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
8670: 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54  SE ){.    db->xT
8680: 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43  race(SQLITE_TRAC
8690: 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72  E_CLOSE, db->pTr
86a0: 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a  aceArg, db, 0);.
86b0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20    }..  /* Force 
86c0: 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c  xDisconnect call
86d0: 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c  s on all virtual
86e0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73   tables */.  dis
86f0: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64  connectAllVtab(d
8700: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  b);..  /* If a t
8710: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
8720: 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65  en, the disconne
8730: 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c  ctAllVtab() call
8740: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
8750: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
8760: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
8770: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
8780: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
8790: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
87a0: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
87b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
87c0: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
87d0: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
87e0: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
87f0: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
8800: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
8810: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
8820: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
8830: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
8840: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
8850: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
8860: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
8870: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
8880: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
8890: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
88a0: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
88b0: 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f  * Legacy behavio
88c0: 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  r (sqlite3_close
88d0: 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20  () behavior) is 
88e0: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
88f0: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68  QLITE_BUSY if th
8900: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
8910: 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69   not be closed i
8920: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
8930: 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d  .  if( !forceZom
8940: 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f  bie && connectio
8950: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
8960: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
8970: 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
8980: 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20  E_BUSY, "unable 
8990: 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20  to close due to 
89a0: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20  unfinalized ".  
89b0: 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73       "statements
89c0: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62   or unfinished b
89d0: 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71  ackups");.    sq
89e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
89f0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8a00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8a10: 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  BUSY;.  }..#ifde
8a20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8a30: 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
8a40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
8a50: 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
8a60: 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68  /* Closing the h
8a70: 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
8a80: 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
8a90: 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a  d the value 2. *
8aa0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  /.    sqlite3Glo
8ab0: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
8ac0: 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g(sqlite3GlobalC
8ad0: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
8ae0: 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d  , db, 0, 2);.  }
8af0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
8b00: 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63  nvert the connec
8b10: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62  tion into a zomb
8b20: 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73  ie and then clos
8b30: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d  e it..  */.  db-
8b40: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
8b50: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20  MAGIC_ZOMBIE;.  
8b60: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
8b70: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
8b80: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
8b90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8ba0: 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73  * Two variations
8bb0: 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69   on the public i
8bc0: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f  nterface for clo
8bd0: 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  sing a database.
8be0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  ** connection. T
8bf0: 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  he sqlite3_close
8c00: 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72  () version retur
8c10: 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ns SQLITE_BUSY a
8c20: 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65  nd.** leaves the
8c30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69   connection opti
8c40: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
8c50: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70  unfinalized prep
8c60: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
8c70: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
8c80: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73   sqlite3_backups
8c90: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  .  The sqlite3_c
8ca0: 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72  lose_v2().** ver
8cb0: 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20  sion forces the 
8cc0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
8cd0: 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66  come a zombie if
8ce0: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e   there are.** un
8cf0: 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73  closed resources
8d00: 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66  , and arranges f
8d10: 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  or deallocation 
8d20: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a  when the last.**
8d30: 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
8d40: 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  nt or sqlite3_ba
8d50: 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a  ckup closes..*/.
8d60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
8d70: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  e(sqlite3 *db){ 
8d80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
8d90: 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74  ose(db,0); }.int
8da0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
8db0: 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  2(sqlite3 *db){ 
8dc0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
8dd0: 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f  ose(db,1); }.../
8de0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d  *.** Close the m
8df0: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
8e00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
8e10: 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  **.** Furthermor
8e20: 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63  e, if database c
8e30: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
8e40: 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e  a zombie (meanin
8e50: 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  g that there.** 
8e60: 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72  has been a prior
8e70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8e80: 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71  _close(db) or sq
8e90: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64  lite3_close_v2(d
8ea0: 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79  b)) and.** every
8eb0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61   sqlite3_stmt ha
8ec0: 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c  s now been final
8ed0: 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73  ized and every s
8ee0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61  qlite3_backup ha
8ef0: 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74  s.** finished, t
8f00: 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73  hen free all res
8f10: 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ources..*/.void 
8f20: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
8f30: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
8f40: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8f50: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20  HashElem *i;    
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74  /* Hash table it
8f80: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
8f90: 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  j;..  /* If ther
8fa0: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
8fb0: 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  g sqlite3_stmt o
8fc0: 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  r sqlite3_backup
8fd0: 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72   objects.  ** or
8fe0: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
8ff0: 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  on has not yet b
9000: 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71  een closed by sq
9010: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
9020: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74  ,.  ** then just
9030: 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78   leave the mutex
9040: 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
9050: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  /.  if( db->magi
9060: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
9070: 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63  ZOMBIE || connec
9080: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
9090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
90a0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
90b0: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
90c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
90d0: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
90e0: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
90f0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
9100: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20  onnection has.  
9110: 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71  ** closed all sq
9120: 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73  lite3_stmt and s
9130: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
9140: 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65  jects and has be
9150: 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74  en.  ** passed t
9160: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20  o sqlite3_close 
9170: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74  (meaning that it
9180: 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20   is a zombie).  
9190: 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20  Therefore,.  ** 
91a0: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65  go ahead and fre
91b0: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
91c0: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  .  */..  /* If a
91d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
91e0: 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61  open, roll it ba
91f0: 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e  ck. This also en
9200: 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20  sures that if.  
9210: 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  ** any database 
9220: 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65  schemas have bee
9230: 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e  n modified by an
9240: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61   uncommitted tra
9250: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68  nsaction.  ** th
9260: 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e  ey are reset. An
9270: 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69  d that the requi
9280: 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
9290: 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65   is held to make
92a0: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20  .  ** the pager 
92b0: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
92c0: 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f  ema reset an ato
92d0: 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a  mic operation. *
92e0: 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  /.  sqlite3Rollb
92f0: 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
9300: 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  E_OK);..  /* Fre
9310: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
9320: 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  g Savepoint stru
9330: 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c  ctures. */.  sql
9340: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
9350: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43  nts(db);..  /* C
9360: 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73  lose all databas
9370: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
9380: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
9390: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
93a0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
93b0: 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20  = &db->aDb[j];. 
93c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
93d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
93e0: 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e  BtreeClose(pDb->
93f0: 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  pBt);.      pDb-
9400: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >pBt = 0;.      
9410: 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20  if( j!=1 ){.    
9420: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
9430: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
9440: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65    }.  }.  /* Cle
9450: 61 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65  ar the TEMP sche
9460: 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e  ma separately an
9470: 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20  d last */.  if( 
9480: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
9490: 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ma ){.    sqlite
94a0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d  3SchemaClear(db-
94b0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
94c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
94d0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
94e0: 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70  );..  /* Free up
94f0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75   the array of au
9500: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
9510: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f  s */.  sqlite3Co
9520: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
9530: 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72  ray(db);.  asser
9540: 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b  t( db->nDb<=2 );
9550: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
9560: 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db==db->aDbStati
9570: 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20  c );..  /* Tell 
9580: 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69  the code in noti
9590: 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f  fy.c that the co
95a0: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67  nnection no long
95b0: 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a  er holds any.  *
95c0: 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73  * locks and does
95d0: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
95e0: 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d   further unlock-
95f0: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
9600: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
9610: 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64  ConnectionClosed
9620: 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73  (db);..  for(i=s
9630: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9640: 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69  db->aFunc); i; i
9650: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9660: 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  i)){.    FuncDef
9670: 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20   *pNext, *p;.   
9680: 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44   p = sqliteHashD
9690: 61 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a  ata(i);.    do{.
96a0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65        functionDe
96b0: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20  stroy(db, p);.  
96c0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
96d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
96e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
96f0: 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78  ;.      p = pNex
9700: 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  t;.    }while( p
9710: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
9720: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
9730: 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d  aFunc);.  for(i=
9740: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9750: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
9760: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9770: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c  ext(i)){.    Col
9780: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
9790: 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48  ollSeq *)sqliteH
97a0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
97b0: 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65  /* Invoke any de
97c0: 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74  structors regist
97d0: 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69  ered for collati
97e0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72  on sequence user
97f0: 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f   data. */.    fo
9800: 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
9810: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  {.      if( pCol
9820: 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20  l[j].xDel ){.   
9830: 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44       pColl[j].xD
9840: 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65  el(pColl[j].pUse
9850: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
9860: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
9870: 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a  ree(db, pColl);.
9880: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
9890: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c  hClear(&db->aCol
98a0: 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
98b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
98c0: 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d  ALTABLE.  for(i=
98d0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
98e0: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69  &db->aModule); i
98f0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9900: 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(i)){.    Modu
9910: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
9920: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
9930: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
9940: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29  pMod->xDestroy )
9950: 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44  {.      pMod->xD
9960: 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75  estroy(pMod->pAu
9970: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  x);.    }.    sq
9980: 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f  lite3VtabEponymo
9990: 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62 2c  usTableClear(db,
99a0: 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69   pMod);.    sqli
99b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d  te3DbFree(db, pM
99c0: 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  od);.  }.  sqlit
99d0: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
99e0: 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
99f0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  f..  sqlite3Erro
9a00: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
9a10: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
9a20: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
9a30: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
9a40: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
9a50: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71  (db->pErr);.  sq
9a60: 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73  lite3CloseExtens
9a70: 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51  ions(db);.#if SQ
9a80: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
9a90: 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74  TICATION.  sqlit
9aa0: 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68  e3_free(db->auth
9ab0: 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73  .zAuthUser);.  s
9ac0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9ad0: 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23  auth.zAuthPW);.#
9ae0: 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67  endif..  db->mag
9af0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
9b00: 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54  C_ERROR;..  /* T
9b10: 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65  he temp-database
9b20: 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63   schema is alloc
9b30: 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  ated differently
9b40: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20   from the other 
9b50: 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65  schema.  ** obje
9b60: 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74  cts (using sqlit
9b70: 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74  eMalloc() direct
9b80: 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ly, instead of s
9b90: 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
9ba0: 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74  a())..  ** So it
9bb0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
9bc0: 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57  ed here. Todo: W
9bd0: 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20  hy not roll the 
9be0: 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f  temp schema into
9bf0: 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73  .  ** the same s
9c00: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73  qliteMalloc() as
9c10: 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c   the one that al
9c20: 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61  locates the data
9c30: 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63  base .  ** struc
9c40: 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c  ture?.  */.  sql
9c50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
9c60: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9c70: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  a);.  sqlite3_mu
9c80: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9c90: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69  tex);.  db->magi
9ca0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
9cb0: 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74  _CLOSED;.  sqlit
9cc0: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62  e3_mutex_free(db
9cd0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
9ce0: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
9cf0: 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a  e.nOut==0 );  /*
9d00: 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b   Fails on a look
9d10: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61  aside memory lea
9d20: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c  k */.  if( db->l
9d30: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
9d40: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
9d50: 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61  3_free(db->looka
9d60: 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20  side.pStart);.  
9d70: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
9d80: 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  (db);.}../*.** R
9d90: 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61  ollback all data
9da0: 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20  base files.  If 
9db0: 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
9dc0: 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a  SQLITE_OK, then.
9dd0: 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63 75 72  ** any write cur
9de0: 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
9df0: 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20  ated ("tripped" 
9e00: 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e  - as in "trippin
9e10: 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62  g a circuit.** b
9e20: 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64  reaker") and mad
9e30: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70  e to return trip
9e40: 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72  Code if there ar
9e50: 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a  e any further.**
9e60: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65   attempts to use
9e70: 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52   that cursor.  R
9e80: 65 61 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61  ead cursors rema
9e90: 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69  in open and vali
9ea0: 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61  d.** but are "sa
9eb0: 76 65 64 22 20 69 6e 20 63 61 73 65 20 74 68 65  ved" in case the
9ec0: 20 74 61 62 6c 65 20 70 61 67 65 73 20 61 72 65   table pages are
9ed0: 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a   moved around..*
9ee0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
9ef0: 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65  llbackAll(sqlite
9f00: 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43  3 *db, int tripC
9f10: 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ode){.  int i;. 
9f20: 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30   int inTrans = 0
9f30: 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68  ;.  int schemaCh
9f40: 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  ange;.  assert( 
9f50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9f60: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
9f70: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
9f80: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
9f90: 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20    /* Obtain all 
9fa0: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62  b-tree mutexes b
9fb0: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79  efore making any
9fc0: 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52   calls to BtreeR
9fd0: 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a  ollback(). .  **
9fe0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
9ff0: 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  nt in case the t
a000: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
a010: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73   rolled back has
a020: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
a030: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
a040: 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  ma. If the b-tre
a050: 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f  e mutexes are no
a060: 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72  t taken.  ** her
a070: 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20  e, then another 
a080: 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e  shared-cache con
a090: 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e  nection might sn
a0a0: 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20  eak in between. 
a0b0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
a0c0: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
a0d0: 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63  hema reset, whic
a0e0: 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73  h can cause fals
a0f0: 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f  e.  ** corruptio
a100: 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d  n reports in som
a110: 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73  e cases.  */.  s
a120: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
a130: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d  All(db);.  schem
a140: 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66  aChange = (db->f
a150: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
a160: 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20  ternChanges)!=0 
a170: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  && db->init.busy
a180: 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ==0;..  for(i=0;
a190: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a1a0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
a1b0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
a1c0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
a1d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
a1e0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
a1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72   ){.        inTr
a200: 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ans = 1;.      }
a210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
a220: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74  reeRollback(p, t
a230: 72 69 70 43 6f 64 65 2c 20 21 73 63 68 65 6d 61  ripCode, !schema
a240: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20  Change);.    }. 
a250: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
a260: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
a270: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
a280: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
a290: 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
a2a0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
a2b0: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
a2c0: 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
a2d0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
a2e0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
a2f0: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
a300: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
a310: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
a320: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
a330: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
a340: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
a350: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
a360: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
a370: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
a380: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
a390: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
a3a0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
a3b0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
a3c0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
a3d0: 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a  _DeferFKs;..  /*
a3e0: 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e   If one has been
a3f0: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76   configured, inv
a400: 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  oke the rollback
a410: 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  -hook callback *
a420: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c  /.  if( db->xRol
a430: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26  lbackCallback &&
a440: 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62   (inTrans || !db
a450: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b  ->autoCommit) ){
a460: 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  .    db->xRollba
a470: 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  ckCallback(db->p
a480: 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20  RollbackArg);.  
a490: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
a4a0: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
a4b0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
a4c0: 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64   name correspond
a4d0: 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ing to the error
a4e0: 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69   code.** specifi
a4f0: 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ed in the argume
a500: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  nt..*/.#if defin
a510: 65 64 28 53 51 4c 49 54 45 5f 4e 45 45 44 5f 45  ed(SQLITE_NEED_E
a520: 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73 74 20 63  RR_NAME).const c
a530: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e  har *sqlite3ErrN
a540: 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63  ame(int rc){.  c
a550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
a560: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f   = 0;.  int i, o
a570: 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f  rigRc = rc;.  fo
a580: 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e  r(i=0; i<2 && zN
a590: 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20  ame==0; i++, rc 
a5a0: 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73 77  &= 0xff){.    sw
a5b0: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
a5c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b    case SQLITE_OK
a5d0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
a5e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a5f0: 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20  E_OK";          
a600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a610: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
a620: 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20  RROR:           
a630: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a640: 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20  TE_ERROR";      
a650: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a660: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a670: 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20  INTERNAL:       
a680: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a690: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20  ITE_INTERNAL";  
a6a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a6b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a6c0: 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20 20  _PERM:          
a6d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a6e0: 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20  LITE_PERM";     
a6f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a700: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a710: 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20 20  E_ABORT:        
a720: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a730: 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20  QLITE_ABORT";   
a740: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a750: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a760: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
a770: 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  K:     zName = "
a780: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
a790: 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61 6b  LBACK";    break
a7a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a7b0: 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20  ITE_BUSY:       
a7c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a7d0: 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20  "SQLITE_BUSY";  
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a7f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a800: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
a810: 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  RY:      zName =
a820: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45   "SQLITE_BUSY_RE
a830: 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72 65  COVERY";     bre
a840: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a850: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
a860: 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  HOT:      zName 
a870: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 53  = "SQLITE_BUSY_S
a880: 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62 72  NAPSHOT";     br
a890: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a8a0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20  SQLITE_LOCKED:  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a8c0: 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   = "SQLITE_LOCKE
a8d0: 44 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  D";            b
a8e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a8f0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
a900: 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d  HAREDCACHE: zNam
a910: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b  e = "SQLITE_LOCK
a920: 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 22 3b  ED_SHAREDCACHE";
a930: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a940: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20  e SQLITE_NOMEM: 
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a960: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d  me = "SQLITE_NOM
a970: 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  EM";            
a980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a990: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
a9a0: 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  LY:           zN
a9b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
a9c0: 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20  ADONLY";        
a9d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a9e0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
a9f0: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a  NLY_RECOVERY:  z
aa00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
aa10: 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59  EADONLY_RECOVERY
aa20: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
aa30: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
aa40: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20  ONLY_CANTLOCK:  
aa50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aa60: 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43  READONLY_CANTLOC
aa70: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
aa80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
aa90: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20  DONLY_ROLLBACK: 
aaa0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aab0: 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
aac0: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
aad0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
aae0: 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20  ADONLY_DBMOVED: 
aaf0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ab00: 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
ab10: 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ED";  break;.   
ab20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ab30: 4e 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20  NTERRUPT:       
ab40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ab50: 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20  TE_INTERRUPT";  
ab60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ab70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ab80: 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20 20  IOERR:          
ab90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aba0: 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20  ITE_IOERR";     
abb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
abc0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
abd0: 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20  _IOERR_READ:    
abe0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
abf0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22  LITE_IOERR_READ"
ac00: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
ac10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ac20: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
ac30: 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  AD:   zName = "S
ac40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
ac50: 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b  T_READ";  break;
ac60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ac70: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20  TE_IOERR_WRITE: 
ac80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ac90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
aca0: 54 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  TE";       break
acb0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
acc0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a  ITE_IOERR_FSYNC:
acd0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ace0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
acf0: 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61  YNC";       brea
ad00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ad10: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
ad20: 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  SYNC:    zName =
ad30: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
ad40: 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65  IR_FSYNC";   bre
ad50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ad60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
ad70: 43 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20  CATE:     zName 
ad80: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ad90: 54 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72  TRUNCATE";    br
ada0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
adb0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
adc0: 41 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  AT:        zName
add0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ade0: 5f 46 53 54 41 54 22 3b 20 20 20 20 20 20 20 62  _FSTAT";       b
adf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ae00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ae10: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LOCK:       zNam
ae20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ae30: 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20  R_UNLOCK";      
ae40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ae50: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
ae60: 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61  DLOCK:       zNa
ae70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ae80: 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20  RR_RDLOCK";     
ae90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aea0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
aeb0: 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e  DELETE:       zN
aec0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
aed0: 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20  ERR_DELETE";    
aee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aef0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
af00: 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a  _NOMEM:        z
af10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
af20: 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  OERR_NOMEM";    
af30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
af40: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
af50: 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20 20  R_ACCESS:       
af60: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
af70: 49 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20  IOERR_ACCESS";  
af80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
af90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
afa0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
afb0: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  LOCK:.          
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
afe0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
aff0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20  KRESERVEDLOCK"; 
b000: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b010: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  e SQLITE_IOERR_L
b020: 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  OCK:         zNa
b030: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b040: 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20  RR_LOCK";       
b050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b060: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b070: 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e  CLOSE:        zN
b080: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b090: 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20  ERR_CLOSE";     
b0a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b0b0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b0c0: 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a  _DIR_CLOSE:    z
b0d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b0e0: 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b  OERR_DIR_CLOSE";
b0f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b100: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b110: 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20  R_SHMOPEN:      
b120: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b130: 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20  IOERR_SHMOPEN"; 
b140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b150: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b160: 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20  RR_SHMSIZE:     
b170: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b180: 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b  _IOERR_SHMSIZE";
b190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b1a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b1b0: 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20  ERR_SHMLOCK:    
b1c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b1d0: 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22  E_IOERR_SHMLOCK"
b1e0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b1f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b200: 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20  OERR_SHMMAP:    
b210: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b220: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22  TE_IOERR_SHMMAP"
b230: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b240: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b250: 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20  IOERR_SEEK:     
b260: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b270: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b  ITE_IOERR_SEEK";
b280: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b290: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b2a0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
b2b0: 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ENT: zName = "SQ
b2c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
b2d0: 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a  E_NOENT";break;.
b2e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b2f0: 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20  E_IOERR_MMAP:   
b300: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b310: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
b320: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
b330: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b340: 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
b350: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
b360: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
b370: 54 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b  TEMPPATH"; break
b380: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b390: 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
b3a0: 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TH:     zName = 
b3b0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  "SQLITE_IOERR_CO
b3c0: 4e 56 50 41 54 48 22 3b 20 20 20 20 62 72 65 61  NVPATH";    brea
b3d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b3e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20  LITE_CORRUPT:   
b3f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b400: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
b410: 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ";           bre
b420: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b430: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
b440: 41 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  AB:       zName 
b450: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  = "SQLITE_CORRUP
b460: 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62 72  T_VTAB";      br
b470: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b480: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a  SQLITE_NOTFOUND:
b490: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b4a0: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   = "SQLITE_NOTFO
b4b0: 55 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62  UND";          b
b4c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b4d0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20   SQLITE_FULL:   
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b4f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c  e = "SQLITE_FULL
b500: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
b510: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b520: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
b530: 4e 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  N:           zNa
b540: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
b550: 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20  TOPEN";         
b560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b570: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
b580: 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e  EN_NOTEMPDIR: zN
b590: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
b5a0: 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52  NTOPEN_NOTEMPDIR
b5b0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
b5c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
b5d0: 50 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a  PEN_ISDIR:     z
b5e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b5f0: 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20  ANTOPEN_ISDIR"; 
b600: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b610: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
b620: 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20  OPEN_FULLPATH:  
b630: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b640: 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
b650: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
b660: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
b670: 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20  TOPEN_CONVPATH: 
b680: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b690: 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
b6a0: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
b6b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
b6c0: 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20  OTOCOL:         
b6d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b6e0: 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20  E_PROTOCOL";    
b6f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b700: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
b710: 4d 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20  MPTY:           
b720: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b730: 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20  TE_EMPTY";      
b740: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b750: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b760: 53 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20  SCHEMA:         
b770: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b780: 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20  ITE_SCHEMA";    
b790: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b7a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b7b0: 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20  _TOOBIG:        
b7c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b7d0: 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20  LITE_TOOBIG";   
b7e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b7f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b800: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20  E_CONSTRAINT:   
b810: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b820: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b830: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
b840: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b850: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
b860: 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  IQUE:  zName = "
b870: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b880: 54 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b  T_UNIQUE"; break
b890: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b8a0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
b8b0: 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20  RIGGER: zName = 
b8c0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b8d0: 4e 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61  NT_TRIGGER";brea
b8e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b8f0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b900: 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20  FOREIGNKEY:.    
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b930: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b940: 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
b950: 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  Y";   break;.   
b960: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b970: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a  ONSTRAINT_CHECK:
b980: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b990: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48  TE_CONSTRAINT_CH
b9a0: 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ECK";  break;.  
b9b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b9c0: 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
b9d0: 52 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20  RYKEY:.         
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ba00: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ba10: 54 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20  T_PRIMARYKEY";  
ba20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ba30: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
ba40: 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e  AINT_NOTNULL: zN
ba50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
ba60: 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c  NSTRAINT_NOTNULL
ba70: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
ba80: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ba90: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
baa0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bad0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
bae0: 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61  MITHOOK";   brea
baf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb00: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bb10: 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  VTAB:    zName =
bb20: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bb30: 49 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65  INT_VTAB";   bre
bb40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb50: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bb60: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bb90: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bba0: 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b  RAINT_FUNCTION";
bbb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bbc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bbd0: 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20  NSTRAINT_ROWID: 
bbe0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bbf0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
bc00: 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ID";  break;.   
bc10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
bc20: 49 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20  ISMATCH:        
bc30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bc40: 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20  TE_MISMATCH";   
bc50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bc60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bc70: 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20 20 20  MISUSE:         
bc80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bc90: 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20  ITE_MISUSE";    
bca0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bcb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bcc0: 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20  _NOLFS:         
bcd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bce0: 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20  LITE_NOLFS";    
bcf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bd00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bd10: 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20  E_AUTH:         
bd20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bd30: 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20  QLITE_AUTH";    
bd40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bd50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bd60: 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20  TE_FORMAT:      
bd70: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bd80: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20  SQLITE_FORMAT"; 
bd90: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bda0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bdb0: 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20  ITE_RANGE:      
bdc0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bdd0: 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20  "SQLITE_RANGE"; 
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bdf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
be00: 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20  LITE_NOTADB:    
be10: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
be20: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22   "SQLITE_NOTADB"
be30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
be40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
be50: 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20  QLITE_ROW:      
be60: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
be70: 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20  = "SQLITE_ROW"; 
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
be90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bea0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20  SQLITE_NOTICE:  
beb0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bec0: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
bed0: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  E";            b
bee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bef0: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52   SQLITE_NOTICE_R
bf00: 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d  ECOVER_WAL: zNam
bf10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49  e = "SQLITE_NOTI
bf20: 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b  CE_RECOVER_WAL";
bf30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bf40: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  e SQLITE_NOTICE_
bf50: 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
bf60: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bf90: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
bfa0: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61  _ROLLBACK"; brea
bfb0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bfc0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20  LITE_WARNING:   
bfd0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bfe0: 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47   "SQLITE_WARNING
bff0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ";           bre
c000: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c010: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
c020: 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20  TOINDEX:  zName 
c030: 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  = "SQLITE_WARNIN
c040: 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72  G_AUTOINDEX"; br
c050: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c060: 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20  SQLITE_DONE:    
c070: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c080: 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22   = "SQLITE_DONE"
c090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
c0a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c0b0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
c0c0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61  {.    static cha
c0d0: 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
c0e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c0f0: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
c100: 42 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b  Buf, "SQLITE_UNK
c110: 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52  NOWN(%d)", origR
c120: 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  c);.    zName = 
c130: 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75  zBuf;.  }.  retu
c140: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
c150: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
c160: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
c170: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
c180: 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
c190: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
c1a0: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  he.** argument..
c1b0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
c1c0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74  qlite3ErrStr(int
c1d0: 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63   rc){.  static c
c1e0: 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74  onst char* const
c1f0: 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMsg[] = {.    
c200: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  /* SQLITE_OK    
c210: 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e        */ "not an
c220: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
c230: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20  SQLITE_ERROR    
c240: 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63     */ "SQL logic
c250: 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e   error or missin
c260: 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20  g database",.   
c270: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   /* SQLITE_INTER
c280: 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  NAL    */ 0,.   
c290: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20   /* SQLITE_PERM 
c2a0: 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73         */ "acces
c2b0: 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e  s permission den
c2c0: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
c2d0: 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20  ITE_ABORT       
c2e0: 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71  */ "callback req
c2f0: 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f  uested query abo
c300: 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  rt",.    /* SQLI
c310: 54 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a  TE_BUSY        *
c320: 2f 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c  / "database is l
c330: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
c340: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20  QLITE_LOCKED    
c350: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74    */ "database t
c360: 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c  able is locked",
c370: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
c380: 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f  OMEM       */ "o
c390: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20  ut of memory",. 
c3a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41     /* SQLITE_REA
c3b0: 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74  DONLY    */ "att
c3c0: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20  empt to write a 
c3d0: 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73  readonly databas
c3e0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
c3f0: 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f  E_INTERRUPT   */
c400: 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a   "interrupted",.
c410: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f      /* SQLITE_IO
c420: 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69  ERR       */ "di
c430: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20  sk I/O error",. 
c440: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52     /* SQLITE_COR
c450: 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74  RUPT     */ "dat
c460: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
c470: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a   is malformed",.
c480: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
c490: 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e  TFOUND    */ "un
c4a0: 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22  known operation"
c4b0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c4c0: 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22  FULL        */ "
c4d0: 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b  database or disk
c4e0: 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f   is full",.    /
c4f0: 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  * SQLITE_CANTOPE
c500: 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20  N    */ "unable 
c510: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
c520: 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53   file",.    /* S
c530: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20  QLITE_PROTOCOL  
c540: 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72    */ "locking pr
c550: 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20  otocol",.    /* 
c560: 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20  SQLITE_EMPTY    
c570: 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e     */ "table con
c580: 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a  tains no data",.
c590: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43      /* SQLITE_SC
c5a0: 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61  HEMA      */ "da
c5b0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
c5c0: 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20  s changed",.    
c5d0: 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  /* SQLITE_TOOBIG
c5e0: 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67        */ "string
c5f0: 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67   or blob too big
c600: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c610: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20  _CONSTRAINT  */ 
c620: 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  "constraint fail
c630: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c640: 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a  TE_MISMATCH    *
c650: 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d  / "datatype mism
c660: 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51  atch",.    /* SQ
c670: 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20  LITE_MISUSE     
c680: 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75   */ "library rou
c690: 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20  tine called out 
c6a0: 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20  of sequence",.  
c6b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46    /* SQLITE_NOLF
c6c0: 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67  S       */ "larg
c6d0: 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69  e file support i
c6e0: 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20  s disabled",.   
c6f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20   /* SQLITE_AUTH 
c700: 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f         */ "autho
c710: 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22  rization denied"
c720: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c730: 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22  FORMAT      */ "
c740: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
c750: 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22  se format error"
c760: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c770: 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22  RANGE       */ "
c780: 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69  bind or column i
c790: 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndex out of rang
c7a0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
c7b0: 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f  E_NOTADB      */
c7c0: 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70   "file is encryp
c7d0: 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20  ted or is not a 
c7e0: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a  database",.  };.
c7f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
c800: 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72  rr = "unknown er
c810: 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20  ror";.  switch( 
c820: 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  rc ){.    case S
c830: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
c840: 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45  BACK: {.      zE
c850: 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20  rr = "abort due 
c860: 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  to ROLLBACK";.  
c870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c880: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
c890: 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66        rc &= 0xff
c8a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
c8b0: 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c  YS(rc>=0) && rc<
c8c0: 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20  ArraySize(aMsg) 
c8d0: 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29  && aMsg[rc]!=0 )
c8e0: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
c8f0: 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20   aMsg[rc];.     
c900: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c910: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c920: 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zErr;.}../*.*
c930: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c940: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79  mplements a busy
c950: 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73   callback that s
c960: 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a  leeps and tries.
c970: 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61  ** again until a
c980: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
c990: 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20  s reached.  The 
c9a0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
c9b0: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e  .** an integer n
c9c0: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
c9d0: 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20  conds passed in 
c9e0: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
c9f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
ca00: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65  tic int sqliteDe
ca10: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
ca20: 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20  k(. void *ptr,  
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ca40: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
ca50: 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e  ion */. int coun
ca60: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
ca70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
ca80: 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65  mes table has be
ca90: 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69  en busy */.){.#i
caa0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  f SQLITE_OS_WIN 
cab0: 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  || HAVE_USLEEP. 
cac0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
cad0: 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20   delays[] =.    
cae0: 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20   { 1, 2, 5, 10, 
caf0: 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20  15, 20, 25, 25, 
cb00: 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31   25,  50,  50, 1
cb10: 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  00 };.  static c
cb20: 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d  onst u8 totals[]
cb30: 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20   =.     { 0, 1, 
cb40: 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35  3,  8, 18, 33, 5
cb50: 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c  3, 78, 103, 128,
cb60: 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64   178, 228 };.# d
cb70: 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72  efine NDELAY Arr
cb80: 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20  aySize(delays). 
cb90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
cba0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
cbb0: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64   int timeout = d
cbc0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
cbd0: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
cbe0: 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  or;..  assert( c
cbf0: 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ount>=0 );.  if(
cc00: 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20   count < NDELAY 
cc10: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  ){.    delay = d
cc20: 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  elays[count];.  
cc30: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
cc40: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65  [count];.  }else
cc50: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
cc60: 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a  lays[NDELAY-1];.
cc70: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
cc80: 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64  ls[NDELAY-1] + d
cc90: 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45  elay*(count-(NDE
cca0: 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69  LAY-1));.  }.  i
ccb0: 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79  f( prior + delay
ccc0: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
ccd0: 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75    delay = timeou
cce0: 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69  t - prior;.    i
ccf0: 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65  f( delay<=0 ) re
cd00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
cd10: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
cd20: 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30  >pVfs, delay*100
cd30: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
cd40: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20  #else.  sqlite3 
cd50: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
cd60: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
cd70: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
cd80: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
cd90: 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e  out;.  if( (coun
cda0: 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65  t+1)*1000 > time
cdb0: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
cdc0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
cdd0: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
cde0: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
cdf0: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
ce00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
ce10: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
ce20: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
ce30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ce40: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
ce50: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77  eration failed w
ce60: 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49  ith a lock..** I
ce70: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
ce80: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
ce90: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
cea0: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
ceb0: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
cec0: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
ced0: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
cee0: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
cef0: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
cf00: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
cf10: 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e  andler *p){.  in
cf20: 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45  t rc;.  if( NEVE
cf30: 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46  R(p==0) || p->xF
cf40: 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75  unc==0 || p->nBu
cf50: 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  sy<0 ) return 0;
cf60: 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63  .  rc = p->xFunc
cf70: 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75  (p->pArg, p->nBu
cf80: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  sy);.  if( rc==0
cf90: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
cfa0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
cfb0: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
cfc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cfd0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
cfe0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
cff0: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
d000: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
d010: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
d020: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
d030: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
d040: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
d050: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d060: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
d070: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
d080: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
d090: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
d0a0: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
d0b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
d0c0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
d0d0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
d0e0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
d0f0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d100: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
d110: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d120: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
d130: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78  b->busyHandler.x
d140: 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20 20  Func = xBusy;.  
d150: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
d160: 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64  pArg = pArg;.  d
d170: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
d180: 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Busy = 0;.  db->
d190: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b  busyTimeout = 0;
d1a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d1b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
d1c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
d1d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
d1e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
d1f0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
d200: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d210: 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67  ne sets the prog
d220: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ress callback fo
d230: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
d240: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
d250: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
d260: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
d270: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  given argument. 
d280: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
d290: 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65  lback will.** be
d2a0: 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e   invoked every n
d2b0: 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  Ops opcodes..*/.
d2c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f  void sqlite3_pro
d2d0: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20  gress_handler(. 
d2e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
d2f0: 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74   int nOps,.  int
d300: 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f   (*xProgress)(vo
d310: 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70  id*), .  void *p
d320: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
d330: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
d340: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
d350: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
d360: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
d370: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
d380: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
d390: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
d3a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d3b0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d3c0: 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a    if( nOps>0 ){.
d3d0: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
d3e0: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
d3f0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
d400: 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Ops = (unsigned)
d410: 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50  nOps;.    db->pP
d420: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
d430: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
d440: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
d450: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  0;.    db->nProg
d460: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
d470: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
d480: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  g = 0;.  }.  sql
d490: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d4a0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  (db->mutex);.}.#
d4b0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
d4c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
d4d0: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
d4e0: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
d4f0: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
d500: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
d510: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
d520: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
d530: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
d540: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
d550: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
d560: 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53  nt ms){.#ifdef S
d570: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
d580: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
d590: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
d5a0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
d5b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d5c0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
d5d0: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c   ms>0 ){.    sql
d5e0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
d5f0: 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61  r(db, sqliteDefa
d600: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c  ultBusyCallback,
d610: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20   (void*)db);.   
d620: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d630: 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = ms;.  }else{.
d640: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
d650: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20  _handler(db, 0, 
d660: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
d670: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d680: 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70  *.** Cause any p
d690: 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ending operation
d6a0: 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20   to stop at its 
d6b0: 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75  earliest opportu
d6c0: 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nity..*/.void sq
d6d0: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
d6e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
d6f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d700: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
d710: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
d720: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
d730: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
d740: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
d750: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
d760: 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73  ndif.  db->u1.is
d770: 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b  Interrupted = 1;
d780: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
d790: 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63  function is exac
d7a0: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20  tly the same as 
d7b0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
d7c0: 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70  unction(), excep
d7d0: 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  t.** that it is 
d7e0: 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63  designed to be c
d7f0: 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61  alled by interna
d800: 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66  l code. The diff
d810: 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61  erence is.** tha
d820: 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  t if a malloc() 
d830: 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33  fails in sqlite3
d840: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
d850: 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  (), an error cod
d860: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
d870: 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46   and the mallocF
d880: 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72  ailed flag clear
d890: 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ed. .*/.int sqli
d8a0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20  te3CreateFunc(. 
d8b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
d8c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
d8d0: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
d8e0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
d8f0: 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44  ,.  void *pUserD
d900: 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  ata,.  void (*xS
d910: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
d920: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
d930: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
d940: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
d950: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
d960: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
d970: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
d980: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
d990: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63  ontext*),.  Func
d9a0: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
d9b0: 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e  tructor.){.  Fun
d9c0: 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cDef *p;.  int n
d9d0: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72  Name;.  int extr
d9e0: 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72  aFlags;..  asser
d9f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
da00: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
da10: 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74   );.  if( zFunct
da20: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20  ionName==0 ||.  
da30: 20 20 20 20 28 78 53 46 75 6e 63 20 26 26 20 28      (xSFunc && (
da40: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
da50: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 53  ) || .      (!xS
da60: 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20  Func && (xFinal 
da70: 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20  && !xStep)) ||. 
da80: 20 20 20 20 20 28 21 78 53 46 75 6e 63 20 26 26       (!xSFunc &&
da90: 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74   (!xFinal && xSt
daa0: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e  ep)) ||.      (n
dab0: 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53  Arg<-1 || nArg>S
dac0: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
dad0: 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20  ON_ARG) ||.     
dae0: 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73   (255<(nName = s
daf0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20  qlite3Strlen30( 
db00: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29  zFunctionName)))
db10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
db20: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
db30: 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  T;.  }..  assert
db40: 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  ( SQLITE_FUNC_CO
db50: 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44  NSTANT==SQLITE_D
db60: 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a  ETERMINISTIC );.
db70: 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65    extraFlags = e
db80: 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54  nc &  SQLITE_DET
db90: 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e  ERMINISTIC;.  en
dba0: 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e  c &= (SQLITE_FUN
dbb0: 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45  C_ENCMASK|SQLITE
dbc0: 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65  _ANY);.  .#ifnde
dbd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
dbe0: 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  F16.  /* If SQLI
dbf0: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
dc00: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
dc10: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
dc20: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
dc30: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
dc40: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
dc50: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
dc60: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
dc70: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
dc80: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
dc90: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
dca0: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ernally..  **.  
dcb0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59  ** If SQLITE_ANY
dcc0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61   is specified, a
dcd0: 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e  dd three version
dce0: 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  s of the functio
dcf0: 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61  n.  ** to the ha
dd00: 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  sh table..  */. 
dd10: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
dd20: 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e  _UTF16 ){.    en
dd30: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
dd40: 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20  NATIVE;.  }else 
dd50: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
dd60: 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ANY ){.    int r
dd70: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
dd80: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
dd90: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
dda0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
ddb0: 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  F8|extraFlags,. 
ddc0: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
ddd0: 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  a, xSFunc, xStep
dde0: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
ddf0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
de00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
de10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
de20: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
de30: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
de40: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
de50: 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73  F16LE|extraFlags
de60: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
de70: 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78  rData, xSFunc, x
de80: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44  Step, xFinal, pD
de90: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
dea0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
deb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ded0: 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  }.    enc = SQLI
dee0: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a  TE_UTF16BE;.  }.
def0: 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51  #else.  enc = SQ
df00: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69  LITE_UTF8;.#endi
df10: 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  f.  .  /* Check 
df20: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66  if an existing f
df30: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
df40: 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64   overridden or d
df50: 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20  eleted. If so,. 
df60: 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
df70: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68  e active VMs, th
df80: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
df90: 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63  _BUSY. If a func
dfa0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69  tion.  ** is bei
dfb0: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65  ng overridden/de
dfc0: 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20  leted but there 
dfd0: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
dfe0: 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a  s, allow the.  *
dff0: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63  * operation to c
e000: 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61  ontinue but inva
e010: 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f  lidate all preco
e020: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
e030: 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  s..  */.  p = sq
e040: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
e050: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
e060: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
e070: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
e080: 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73  && (p->funcFlags
e090: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
e0a0: 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20  NCMASK)==enc && 
e0b0: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b  p->nArg==nArg ){
e0c0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
e0d0: 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
e0e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
e0f0: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
e100: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
e110: 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
e120: 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75  e/modify user-fu
e130: 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63  nction due to ac
e140: 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
e150: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e160: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
e170: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
e180: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
e190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e1a0: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
e1b0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
e1c0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
e1d0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
e1e0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
e1f0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
e200: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b  rg, (u8)enc, 1);
e210: 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64  .  assert(p || d
e220: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
e230: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
e240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e250: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
e260: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65  .  /* If an olde
e270: 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  r version of the
e280: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61   function with a
e290: 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74   configured dest
e2a0: 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62  ructor is.  ** b
e2b0: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e  eing replaced in
e2c0: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
e2d0: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  tor function her
e2e0: 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e  e. */.  function
e2f0: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
e300: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
e310: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
e320: 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  uctor->nRef++;. 
e330: 20 7d 0a 20 20 70 2d 3e 75 2e 70 44 65 73 74 72   }.  p->u.pDestr
e340: 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63  uctor = pDestruc
e350: 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c  tor;.  p->funcFl
e360: 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c  ags = (p->funcFl
e370: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
e380: 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74  C_ENCMASK) | ext
e390: 72 61 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63  raFlags;.  testc
e3a0: 61 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67  ase( p->funcFlag
e3b0: 73 20 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52  s & SQLITE_DETER
e3c0: 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d  MINISTIC );.  p-
e3d0: 3e 78 53 46 75 6e 63 20 3d 20 78 53 46 75 6e 63  >xSFunc = xSFunc
e3e0: 20 3f 20 78 53 46 75 6e 63 20 3a 20 78 53 74 65   ? xSFunc : xSte
e3f0: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
e400: 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d  e = xFinal;.  p-
e410: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
e420: 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72  erData;.  p->nAr
e430: 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20  g = (u16)nArg;. 
e440: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e450: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
e460: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
e470: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
e480: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e490: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
e4a0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
e4b0: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
e4c0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
e4d0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
e4e0: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
e4f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e500: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e510: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e520: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
e530: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e540: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e550: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
e560: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
e570: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
e580: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e590: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e  tion_v2(db, zFun
e5a0: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
e5b0: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a   xSFunc, xStep,.
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a      xFinal, 0);.
e5f0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  }..int sqlite3_c
e600: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
e610: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
e620: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e630: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
e640: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
e650: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
e660: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e670: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e690: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e6a0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e6b0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e6c0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e6d0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e6e0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
e6f0: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29  void (*xDestroy)
e700: 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e  (void *).){.  in
e710: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
e720: 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72  ROR;.  FuncDestr
e730: 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b  uctor *pArg = 0;
e740: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e750: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e760: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
e770: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
e780: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e790: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e7a0: 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
e7b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e7c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e7d0: 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29    if( xDestroy )
e7e0: 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75  {.    pArg = (Fu
e7f0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73  ncDestructor *)s
e800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
e810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75  ro(db, sizeof(Fu
e820: 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a  ncDestructor));.
e830: 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b      if( !pArg ){
e840: 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28  .      xDestroy(
e850: 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  p);.      goto o
e860: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ut;.    }.    pA
e870: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
e880: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
e890: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
e8a0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
e8b0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
e8c0: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
e8d0: 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20  enc, p, xSFunc, 
e8e0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
e8f0: 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67  Arg);.  if( pArg
e900: 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d   && pArg->nRef==
e910: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
e920: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e930: 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70  ;.    xDestroy(p
e940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e950: 46 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a  Free(db, pArg);.
e960: 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20    }.. out:.  rc 
e970: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
e980: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
e990: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e9a0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
e9b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
e9c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e9d0: 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65  UTF16.int sqlite
e9e0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
e9f0: 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  n16(.  sqlite3 *
ea00: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db,.  const void
ea10: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
ea20: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
ea30: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76  nt eTextRep,.  v
ea40: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
ea50: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
ea60: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
ea70: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
ea80: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
ea90: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
eaa0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
eab0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
eac0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
ead0: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69  context*).){.  i
eae0: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
eaf0: 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53  Func8;..#ifdef S
eb00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
eb10: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
eb20: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
eb30: 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74  Ok(db) || zFunct
eb40: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ionName==0 ) ret
eb50: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
eb60: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
eb70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
eb80: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
eb90: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
eba0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
ebb0: 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74    zFunc8 = sqlit
ebc0: 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
ebd0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31  FunctionName, -1
ebe0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
ebf0: 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71  TIVE);.  rc = sq
ec00: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
ec10: 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67  db, zFunc8, nArg
ec20: 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78  , eTextRep, p, x
ec30: 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e  SFunc,xStep,xFin
ec40: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
ec50: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
ec60: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
ec70: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
ec80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
ec90: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
eca0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
ecb0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
ecc0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
ecd0: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
ece0: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
ecf0: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
ed00: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
ed10: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
ed20: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
ed30: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
ed40: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
ed50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
ed60: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
ed70: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
ed80: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
ed90: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
eda0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
edb0: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
edc0: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
edd0: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
ede0: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
edf0: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
ee00: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
ee10: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
ee20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
ee30: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
ee40: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
ee50: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
ee60: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
ee70: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
ee80: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
ee90: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
eea0: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
eeb0: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
eec0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
eed0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
eee0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
eef0: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
ef00: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ef10: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ef20: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
ef30: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
ef40: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
ef50: 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ) || zName==0 ||
ef60: 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20   nArg<-2 ){.    
ef70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
ef80: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
ef90: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
efa0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
efb0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
efc0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
efd0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  n(db, zName, nAr
efe0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
eff0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  0)==0 ){.    rc 
f000: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
f010: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
f020: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
f030: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
f050: 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
f060: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  nction, 0, 0, 0)
f070: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f080: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
f090: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
f0a0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f0b0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f0c0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
f0d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
f0e0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f0f0: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
f100: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
f110: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
f120: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
f130: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
f140: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
f150: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
f160: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
f170: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
f180: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
f190: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
f1a0: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
f1b0: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
f1c0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f1d0: 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74  f each.** SQL st
f1e0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e  atement..*/.#ifn
f1f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f200: 44 45 50 52 45 43 41 54 45 44 0a 76 6f 69 64 20  DEPRECATED.void 
f210: 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73  *sqlite3_trace(s
f220: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
f230: 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a   (*xTrace)(void*
f240: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76  ,const char*), v
f250: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f  oid *pArg){.  vo
f260: 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
f270: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f280: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f290: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f2a0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f2b0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
f2c0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
f2d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
f2e0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f2f0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f300: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
f310: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
f320: 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 78 54 72  db->mTrace = xTr
f330: 61 63 65 20 3f 20 53 51 4c 49 54 45 5f 54 52 41  ace ? SQLITE_TRA
f340: 43 45 5f 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20  CE_LEGACY : 0;. 
f350: 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 28 69   db->xTrace = (i
f360: 6e 74 28 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c  nt(*)(u32,void*,
f370: 76 6f 69 64 2a 2c 69 36 34 29 29 78 54 72 61 63  void*,i64))xTrac
f380: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
f390: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
f3a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f3b0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f3c0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65  eturn pOld;.}.#e
f3d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f3e0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a  MIT_DEPRECATED *
f3f0: 2f 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61  /../* Register a
f400: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
f410: 75 73 69 6e 67 20 74 68 65 20 76 65 72 73 69 6f  using the versio
f420: 6e 2d 32 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  n-2 interface..*
f430: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 72  /.int sqlite3_tr
f440: 61 63 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ace_v2(.  sqlite
f450: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f480: 54 72 61 63 65 20 74 68 69 73 20 63 6f 6e 6e 65  Trace this conne
f490: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 28 2a  ction */.  int(*
f4a0: 78 54 72 61 63 65 29 28 75 6e 73 69 67 6e 65 64  xTrace)(unsigned
f4b0: 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 73 71 6c  ,void*,void*,sql
f4c0: 69 74 65 33 5f 69 6e 74 36 34 29 2c 20 20 2f 2a  ite3_int64),  /*
f4d0: 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76   Callback to inv
f4e0: 6f 6b 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  oke */.  unsigne
f4f0: 64 20 6d 54 72 61 63 65 2c 20 20 20 20 20 20 20  d mTrace,       
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f520: 50 73 20 74 6f 20 62 65 20 74 72 61 63 65 64 20  Ps to be traced 
f530: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
f570: 78 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  xt */.){.#ifdef 
f580: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f590: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f5a0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f5b0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
f5c0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
f5d0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
f5e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
f5f0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f600: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f610: 78 29 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65  x);.  db->mTrace
f620: 20 3d 20 6d 54 72 61 63 65 3b 0a 20 20 64 62 2d   = mTrace;.  db-
f630: 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65  >xTrace = xTrace
f640: 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72  ;.  db->pTraceAr
f650: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
f660: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f670: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f690: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
f6a0: 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  r a profile func
f6b0: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
f6c0: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
f6d0: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a  sly registered .
f6e0: 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  ** profile funct
f6f0: 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ion is returned.
f700: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
f710: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
f720: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70   means that no p
f730: 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63  rofiling is exec
f740: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
f750: 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20  L.** profile is 
f760: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
f770: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
f780: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
f790: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20  onclusion of.** 
f7a0: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
f7b0: 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a  nt that is run..
f7c0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
f7d0: 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69  _profile(.  sqli
f7e0: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
f7f0: 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64  (*xProfile)(void
f800: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
f810: 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20  lite_uint64),.  
f820: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
f830: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66  void *pOld;..#if
f840: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f850: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f860: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f870: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
f880: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
f890: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
f8a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
f8b0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f8c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f8d0: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
f8e0: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
f8f0: 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65  ;.  db->xProfile
f900: 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64   = xProfile;.  d
f910: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d  b->pProfileArg =
f920: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
f930: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f940: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f950: 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
f960: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f970: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
f980: 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74  Register a funct
f990: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
f9a0: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
f9b0: 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a  tion commits..**
f9c0: 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20   If the invoked 
f9d0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
f9e0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
f9f0: 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d  the commit becom
fa00: 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  es a.** rollback
fa10: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
fa20: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a  e3_commit_hook(.
fa30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fa50: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
fa60: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
fa70: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c  */.  int (*xCall
fa80: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f  back)(void*),  /
fa90: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e  * Function to in
faa0: 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d  voke on each com
fab0: 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  mit */.  void *p
fac0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
fad0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
fae0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
faf0: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  /.){.  void *pOl
fb00: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
fb10: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
fb20: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
fb30: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
fb40: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
fb50: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
fb60: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
fb70: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
fb80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fb90: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
fba0: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
fbb0: 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
fbc0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
fbd0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
fbe0: 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
fbf0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
fc00: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
fc10: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
fc20: 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
fc30: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
fc40: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
fc50: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
fc60: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
fc70: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
fc80: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
fc90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
fca0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
fcb0: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
fcc0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fce0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
fcf0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
fd00: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
fd10: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
fd20: 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
fd30: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
fd40: 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
fd50: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
fd60: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
fd70: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
fd80: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
fd90: 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53  *pRet;..#ifdef S
fda0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
fdb0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
fdc0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
fdd0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
fde0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
fdf0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
fe00: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
fe10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fe20: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
fe30: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
fe40: 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62  pUpdateArg;.  db
fe50: 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
fe60: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
fe70: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20   db->pUpdateArg 
fe80: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
fe90: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
fea0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
feb0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
fec0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
fed0: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
fee0: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
fef0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
ff00: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79  olled.** back by
ff10: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
ff20: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
ff30: 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c  id *sqlite3_roll
ff40: 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  back_hook(.  sql
ff50: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
ff60: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
ff70: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
ff80: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
ff90: 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
ffa0: 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c  )(void*), /* Cal
ffb0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
ffc0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ffe0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
fff0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
10000 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
10010 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10020 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10030 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10040 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
10050 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
10060 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
10070 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10080 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10090 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
100a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
100b0 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   = db->pRollback
100c0 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c  Arg;.  db->xRoll
100d0 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78  backCallback = x
100e0 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
100f0 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70  pRollbackArg = p
10100 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
10110 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
10120 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10130 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  pRet;.}..#ifdef 
10140 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
10150 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a  EUPDATE_HOOK./*.
10160 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
10170 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
10180 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
10190 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
101a0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
101b0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
101c0 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
101d0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
101e0 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61  *sqlite3_preupda
101f0 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  te_hook(.  sqlit
10200 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
10210 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
10220 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
10230 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
10240 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20  id(*xCallback)( 
10250 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62          /* Callb
10260 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
10270 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65      void*,sqlite
10280 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  3*,int,char cons
10290 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73  t*,char const*,s
102a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c  qlite3_int64,sql
102b0 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76  ite3_int64),.  v
102c0 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
102d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
102e0 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d  t callback argum
102f0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ent */.){.  void
10300 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
10310 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10320 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
10330 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74   = db->pPreUpdat
10340 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65  eArg;.  db->xPre
10350 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
10360 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
10370 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 20  ->pPreUpdateArg 
10380 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
10390 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
103a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
103b0 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
103c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
103d0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
103e0 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
103f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
10400 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
10410 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
10420 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
10430 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  y sqlite3_wal_au
10440 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a  tocheckpoint()..
10450 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ** Invoke sqlite
10460 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
10470 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
10480 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  f frames in the 
10490 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67  log file.** is g
104a0 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69  reater than sqli
104b0 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74  te3.pWalArg cast
104c0 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28   to an integer (
104d0 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
104e0 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61  ured by.** wal_a
104f0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29  utocheckpoint())
10500 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
10510 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28  3WalDefaultHook(
10520 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  .  void *pClient
10530 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67  Data,     /* Arg
10540 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ument */.  sqlit
10550 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
10560 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
10570 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10580 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44  *zDb,       /* D
10590 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
105a0 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20   nFrame         
105b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57      /* Size of W
105c0 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e  AL */.){.  if( n
105d0 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54  Frame>=SQLITE_PT
105e0 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74  R_TO_INT(pClient
105f0 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c  Data) ){.    sql
10600 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
10610 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
10620 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10630 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
10640 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
10650 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
10660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10670 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
10680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
10690 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  */../*.** Config
106a0 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77  ure an sqlite3_w
106b0 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
106c0 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ck to automatica
106d0 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  lly checkpoint.*
106e0 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74  * a database aft
106f0 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
10700 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
10710 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20  here are nFrame 
10720 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65  or.** more frame
10730 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
10740 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20  e. Passing zero 
10750 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  or a negative va
10760 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46  lue as the.** nF
10770 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64  rame parameter d
10780 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69  isables automati
10790 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e  c checkpoints en
107a0 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  tirely..**.** Th
107b0 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  e callback regis
107c0 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
107d0 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20  nction replaces 
107e0 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c  any existing cal
107f0 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65  lback.** registe
10800 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  red using sqlite
10810 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69  3_wal_hook(). Li
10820 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72  kewise, register
10830 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a  ing a callback.*
10840 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  * using sqlite3_
10850 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62  wal_hook() disab
10860 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  les the automati
10870 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63  c checkpoint mec
10880 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67  hanism.** config
10890 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ured by this fun
108a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
108b0 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
108c0 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
108d0 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65   *db, int nFrame
108e0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
108f0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53  _OMIT_WAL.  UNUS
10900 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
10910 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
10920 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65  ETER(nFrame);.#e
10930 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49 54  lse.#ifdef SQLIT
10940 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10950 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10960 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10970 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
10980 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10990 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46 72  #endif.  if( nFr
109a0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ame>0 ){.    sql
109b0 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
109c0 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  , sqlite3WalDefa
109d0 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f  ultHook, SQLITE_
109e0 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d  INT_TO_PTR(nFram
109f0 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
10a00 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
10a10 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  ok(db, 0, 0);.  
10a20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
10a30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10a40 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
10a50 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
10a60 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
10a70 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
10a80 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
10a90 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  to the write-ahe
10aa0 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64  ad-log by this d
10ab0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10ac0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
10ad0 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20  ite3_wal_hook(. 
10ae0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
10b10 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68  ook to this db h
10b20 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a  andle */.  int(*
10b30 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20  xCallback)(void 
10b40 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e  *, sqlite3*, con
10b50 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a  st char*, int),.
10b60 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
10b90 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43  ent passed to xC
10ba0 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a  allback() */.){.
10bb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10bc0 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a  MIT_WAL.  void *
10bd0 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  pRet;.#ifdef SQL
10be0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10bf0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
10c00 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
10c10 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
10c20 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
10c30 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
10c40 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
10c50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10c60 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10c70 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57  .  pRet = db->pW
10c80 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61  alArg;.  db->xWa
10c90 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  lCallback = xCal
10ca0 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61  lback;.  db->pWa
10cb0 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  lArg = pArg;.  s
10cc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10cd0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10ce0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65   return pRet;.#e
10cf0 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  lse.  return 0;.
10d00 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
10d10 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
10d20 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20  ase zDb..*/.int 
10d30 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
10d40 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c  kpoint_v2(.  sql
10d50 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d70 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
10d80 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10d90 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *zDb,           
10da0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
10db0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
10dc0 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  e (or NULL) */. 
10dd0 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20   int eMode,     
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
10e00 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f  POINT_* value */
10e10 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20  .  int *pnLog,  
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
10e40 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72  of WAL log in fr
10e50 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ames */.  int *p
10e60 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20  nCkpt           
10e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
10e80 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  : Total number o
10e90 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f  f frames checkpo
10ea0 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64  inted */.){.#ifd
10eb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
10ec0 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  AL.  return SQLI
10ed0 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69  TE_OK;.#else.  i
10ee0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10f00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10f10 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c  .  int iDb = SQL
10f20 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
10f30 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44  ;  /* sqlite3.aD
10f40 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20  b[] index of db 
10f50 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  to checkpoint */
10f60 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10f70 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10f80 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10f90 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10fa0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10fb0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
10fc0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ndif..  /* Initi
10fd0 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
10fe0 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31   variables to -1
10ff0 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
11000 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69  r occurs. */.  i
11010 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f  f( pnLog ) *pnLo
11020 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e  g = -1;.  if( pn
11030 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d  Ckpt ) *pnCkpt =
11040 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   -1;..  assert( 
11050 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
11060 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a  T_PASSIVE==0 );.
11070 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
11080 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
11090 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
110a0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
110b0 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b  NT_RESTART==2 );
110c0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
110d0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
110e0 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66  NCATE==3 );.  if
110f0 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
11100 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
11110 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
11120 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
11130 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  NCATE ){.    /* 
11140 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
11150 33 39 39 36 2d 31 32 30 38 38 20 54 68 65 20 4d  3996-12088 The M
11160 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
11170 62 65 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b  be a valid check
11180 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64  point.    ** mod
11190 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  e: */.    return
111a0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
111b0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d    }..  sqlite3_m
111c0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
111d0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62  utex);.  if( zDb
111e0 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20   && zDb[0] ){.  
111f0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
11200 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
11210 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  b);.  }.  if( iD
11220 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  b<0 ){.    rc = 
11230 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11240 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
11250 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
11260 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e  _ERROR, "unknown
11270 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20   database: %s", 
11280 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  zDb);.  }else{. 
11290 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c     db->busyHandl
112a0 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
112b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
112c0 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62  eckpoint(db, iDb
112d0 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
112e0 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c  pnCkpt);.    sql
112f0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
11300 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
11310 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
11320 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
11330 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
11340 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
11350 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
11360 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
11370 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49   database zDb. I
11380 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f  f zDb is NULL, o
11390 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  r if the buffer 
113a0 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zDb points.** to
113b0 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f   contains a zero
113c0 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20  -length string, 
113d0 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
113e0 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63  abases are .** c
113f0 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a  heckpointed..*/.
11400 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
11410 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
11420 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
11430 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45  ar *zDb){.  /* E
11440 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31  VIDENCE-OF: R-41
11450 36 31 33 2d 32 30 35 35 33 20 54 68 65 20 73 71  613-20553 The sq
11460 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
11470 6f 69 6e 74 28 44 2c 58 29 20 69 73 20 65 71 75  oint(D,X) is equ
11480 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  ivalent to.  ** 
11490 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
114a0 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51  kpoint_v2(D,X,SQ
114b0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
114c0 50 41 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f  PASSIVE,0,0). */
114d0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
114e0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
114f0 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54  _v2(db,zDb,SQLIT
11500 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
11510 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69  SIVE,0,0);.}..#i
11520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11530 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  T_WAL./*.** Run 
11540 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20  a checkpoint on 
11550 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68  database iDb. Th
11560 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
11570 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73   database iDb is
11580 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  .** not currentl
11590 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  y open in WAL mo
115a0 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  de..**.** If a t
115b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
115c0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
115d0 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  se being checkpo
115e0 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20  inted, this .** 
115f0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11600 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61   SQLITE_LOCKED a
11610 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  nd a checkpoint 
11620 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
11630 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
11640 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
11650 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b  unning the check
11660 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65  point, an SQLite
11670 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
11680 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65  ** returned (i.e
11690 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e  . SQLITE_IOERR).
116a0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
116b0 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
116c0 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
116d0 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f  se handle db sho
116e0 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74  uld be held by t
116f0 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d  he caller. The m
11700 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74  utex.** associat
11710 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
11720 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e  ific b-tree bein
11730 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69  g checkpointed i
11740 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68  s taken by.** th
11750 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  is function whil
11760 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
11770 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a   is running..**.
11780 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73  ** If iDb is pas
11790 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  sed SQLITE_MAX_A
117a0 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c  TTACHED, then al
117b0 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
117c0 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63  ases are.** chec
117d0 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20  kpointed. If an 
117e0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
117f0 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72  ered it is retur
11800 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ned immediately 
11810 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20  -.** no attempt 
11820 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b  is made to check
11830 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e  point any remain
11840 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ing databases..*
11850 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
11860 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53  Mode is one of S
11870 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
11880 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f  _PASSIVE, FULL o
11890 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e  r RESTART..*/.in
118a0 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f  t sqlite3Checkpo
118b0 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
118c0 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d   int iDb, int eM
118d0 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  ode, int *pnLog,
118e0 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20   int *pnCkpt){. 
118f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11900 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
11910 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
11920 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
11950 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
11960 61 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a  attached dbs */.
11970 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b    int bBusy = 0;
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c    /* True if SQL
119a0 49 54 45 5f 42 55 53 59 20 68 61 73 20 62 65 65  ITE_BUSY has bee
119b0 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  n encountered */
119c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
119d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
119e0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
119f0 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c  ssert( !pnLog ||
11a00 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20   *pnLog==-1 );. 
11a10 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74   assert( !pnCkpt
11a20 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20   || *pnCkpt==-1 
11a30 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
11a40 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d  <db->nDb && rc==
11a50 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
11a60 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20  .    if( i==iDb 
11a70 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d  || iDb==SQLITE_M
11a80 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20  AX_ATTACHED ){. 
11a90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11aa0 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74  3BtreeCheckpoint
11ab0 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c  (db->aDb[i].pBt,
11ac0 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70   eMode, pnLog, p
11ad0 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e  nCkpt);.      pn
11ae0 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Log = 0;.      p
11af0 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20  nCkpt = 0;.     
11b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11b10 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
11b20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20  bBusy = 1;.     
11b30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
11b40 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
11b50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
11b60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11b70 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45   bBusy) ? SQLITE
11b80 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65  _BUSY : rc;.}.#e
11b90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11ba0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
11bb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11bc0 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
11bd0 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75  main-memory shou
11be0 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ld be used inste
11bf0 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  ad of.** a tempo
11c00 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72  rary file for tr
11c10 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66 69  ansient pager fi
11c20 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  les and statemen
11c30 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  t journals..** T
11c40 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
11c50 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
11c60 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65   value of db->te
11c70 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d  mp_store (runtim
11c80 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20  e.** parameter) 
11c90 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20  and the compile 
11ca0 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51  time value of SQ
11cb0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e  LITE_TEMP_STORE.
11cc0 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
11cd0 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
11ce0 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  s the relationsh
11cf0 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 73 65  ip between these
11d00 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61   two values.** a
11d10 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
11d20 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a  s return value..
11d30 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54  **.**   SQLITE_T
11d40 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62  EMP_STORE     db
11d50 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20  ->temp_store    
11d60 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d   Location of tem
11d70 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 0a  porary database.
11d80 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
11d90 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
11db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
11dd0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
11de0 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
11df0 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
11e00 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
11e10 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
11e20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
11e40 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
11e50 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
11e90 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 1).**   1    
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
11ec0 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
11ed0 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
11f00 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
11f10 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
11f20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
11f30 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
11f40 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
11f50 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
11f60 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
11f70 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
11f90 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
11fa0 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20  ).**   3        
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
11fe0 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n 1).*/.int sqli
11ff0 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
12000 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64  const sqlite3 *d
12010 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  b){.#if SQLITE_T
12020 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72  EMP_STORE==1.  r
12030 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70  eturn ( db->temp
12040 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e  _store==2 );.#en
12050 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
12060 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72  EMP_STORE==2.  r
12070 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70  eturn ( db->temp
12080 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e  _store!=1 );.#en
12090 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
120a0 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 55  EMP_STORE==3.  U
120b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
120c0 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  db);.  return 1;
120d0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
120e0 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20  TE_TEMP_STORE<1 
120f0 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  || SQLITE_TEMP_S
12100 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53 45 44 5f  TORE>3.  UNUSED_
12110 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
12120 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
12130 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
12140 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  n UTF-8 encoded 
12150 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
12160 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
12170 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
12180 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
12190 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
121a0 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20  _errmsg(sqlite3 
121b0 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
121c0 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  ar *z;.  if( !db
121d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
121e0 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
121f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
12200 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
12210 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
12220 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
12230 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12240 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49  ErrStr(SQLITE_MI
12250 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a  SUSE_BKPT);.  }.
12260 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12270 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
12280 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
12290 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
122a0 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
122b0 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  r(SQLITE_NOMEM_B
122c0 4b 50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  KPT);.  }else{. 
122d0 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d     testcase( db-
122e0 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20  >pErr==0 );.    
122f0 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
12300 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62  e3_value_text(db
12310 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73  ->pErr);.    ass
12320 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
12330 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
12340 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
12350 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
12360 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a  r(db->errCode);.
12370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
12380 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
12390 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
123a0 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
123b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
123c0 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TF16./*.** Retur
123d0 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  n UTF-16 encoded
123e0 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
123f0 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
12400 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12410 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
12420 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
12430 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74  3_errmsg16(sqlit
12440 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69  e3 *db){.  stati
12450 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f  c const u16 outO
12460 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  fMem[] = {.    '
12470 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
12480 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27  ', 'o', 'f', ' '
12490 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c  , 'm', 'e', 'm',
124a0 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'o', 'r', 'y', 
124b0 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
124c0 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65  const u16 misuse
124d0 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20  [] = {.    'l', 
124e0 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27  'i', 'b', 'r', '
124f0 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20  a', 'r', 'y', ' 
12500 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27  ', .    'r', 'o'
12510 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c  , 'u', 't', 'i',
12520 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20   'n', 'e', ' ', 
12530 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27  .    'c', 'a', '
12540 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64  l', 'l', 'e', 'd
12550 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
12560 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
12570 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20   .    'o', 'f', 
12580 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27  ' ', .    's', '
12590 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65  e', 'q', 'u', 'e
125a0 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27  ', 'n', 'c', 'e'
125b0 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
125c0 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
125d0 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
125e0 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66  rn (void *)outOf
125f0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Mem;.  }.  if( !
12600 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12610 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
12620 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
12630 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d  id *)misuse;.  }
12640 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12650 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
12660 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
12670 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12680 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74   z = (void *)out
12690 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OfMem;.  }else{.
126a0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
126b0 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
126c0 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  >pErr);.    if( 
126d0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
126e0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
126f0 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64  g(db, db->errCod
12700 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  e, sqlite3ErrStr
12710 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a  (db->errCode));.
12720 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
12730 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
12740 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a  b->pErr);.    }.
12750 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28      /* A malloc(
12760 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65  ) may have faile
12770 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
12780 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c  l to sqlite3_val
12790 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20  ue_text16().    
127a0 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69  ** above. If thi
127b0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
127c0 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  hen the db->mall
127d0 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65  ocFailed flag ne
127e0 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
127f0 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
12800 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
12810 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
12820 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20  tead of via.    
12830 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  ** sqlite3ApiExi
12840 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65  t(), to avoid se
12850 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  tting the databa
12860 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20  se handle error 
12870 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  message..    */.
12880 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c      sqlite3OomCl
12890 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73  ear(db);.  }.  s
128a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
128b0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
128c0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
128d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
128e0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
128f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
12900 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
12910 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
12920 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
12930 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
12940 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
12950 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
12960 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
12970 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
12980 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
12990 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
129a0 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
129b0 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
129c0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
129d0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
129e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
129f0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12a00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
12a10 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
12a20 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
12a30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12a40 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
12a50 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20  n db->errCode & 
12a60 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69  db->errMask;.}.i
12a70 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
12a80 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69  ded_errcode(sqli
12a90 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
12aa0 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61  db && !sqlite3Sa
12ab0 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
12ac0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
12ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
12ae0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  E_BKPT;.  }.  if
12af0 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
12b00 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12b20 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
12b30 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
12b40 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ode;.}.int sqlit
12b50 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28  e3_system_errno(
12b60 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
12b70 72 65 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e  return db ? db->
12b80 69 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d  iSysErrno : 0;.}
12b90 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e    ../*.** Return
12ba0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
12bb0 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e  escribes the kin
12bc0 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69  d of error speci
12bd0 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61  fied in the.** a
12be0 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f  rgument.  For no
12bf0 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63  w, this simply c
12c00 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61  alls the interna
12c10 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  l sqlite3ErrStr(
12c20 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ).** function..*
12c30 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
12c40 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74  lite3_errstr(int
12c50 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   rc){.  return s
12c60 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
12c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
12c80 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e  e a new collatin
12c90 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  g function for d
12ca0 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54  atabase "db".  T
12cb0 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65  he name is zName
12cc0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f  .** and the enco
12cd0 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a  ding is enc..*/.
12ce0 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
12cf0 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  eCollation(.  sq
12d00 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e  lite3* db,.  con
12d10 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
12d20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69  .  u8 enc,.  voi
12d30 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
12d40 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
12d50 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
12d60 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
12d70 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
12d80 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c  void*).){.  Coll
12d90 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
12da0 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73  t enc2;.  .  ass
12db0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12dc0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
12dd0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  x) );..  /* If S
12de0 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
12df0 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
12e00 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
12e10 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
12e20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
12e30 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
12e40 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
12e50 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
12e60 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
12e70 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
12e80 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
12e90 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
12ea0 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20  .  enc2 = enc;. 
12eb0 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
12ec0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b  =SQLITE_UTF16 );
12ed0 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
12ee0 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
12ef0 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28  ALIGNED );.  if(
12f00 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
12f10 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c  F16 || enc2==SQL
12f20 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
12f30 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20  D ){.    enc2 = 
12f40 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
12f50 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e  VE;.  }.  if( en
12f60 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c2<SQLITE_UTF8 |
12f70 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54  | enc2>SQLITE_UT
12f80 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74  F16BE ){.    ret
12f90 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
12fa0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BKPT;.  }..  /
12fb0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
12fc0 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67  call is removing
12fd0 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e   or replacing an
12fe0 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74   existing collat
12ff0 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ion .  ** sequen
13000 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74  ce. If so, and t
13010 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
13020 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79  VMs, return busy
13030 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  . If there.  ** 
13040 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
13050 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  s, invalidate an
13060 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  y pre-compiled s
13070 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
13080 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13090 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
130a0 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
130b0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 0);.  if( pCol
130c0 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
130d0 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
130e0 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20  nVdbeActive ){. 
130f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13100 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
13110 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
13120 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
13130 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c  lete/modify coll
13140 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64  ation sequence d
13150 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
13160 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
13170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
13180 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
13190 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
131a0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
131b0 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63  b);..    /* If c
131c0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
131d0 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61  e pColl was crea
131e0 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20  ted directly by 
131f0 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  a call to.    **
13200 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13210 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e  collation, and n
13220 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ot generated by 
13230 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a  synthCollSeq(),.
13240 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20      ** then any 
13250 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73  copies made by s
13260 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65  ynthCollSeq() ne
13270 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ed to be invalid
13280 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  ated..    ** Als
13290 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73  o, collation des
132a0 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65  tructor - CollSe
132b0 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74  q.xDel() - funct
132c0 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ion may need.   
132d0 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64   ** to be called
132e0 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66  ..    */ .    if
132f0 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20  ( (pColl->enc & 
13300 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  ~SQLITE_UTF16_AL
13310 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a  IGNED)==enc2 ){.
13320 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61        CollSeq *a
13330 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
13340 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
13350 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  lSeq, zName);.  
13360 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
13370 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
13380 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
13390 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c  lSeq *p = &aColl
133a0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
133b0 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e   p->enc==pColl->
133c0 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  enc ){.         
133d0 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a   if( p->xDel ){.
133e0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78              p->x
133f0 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20  Del(p->pUser);. 
13400 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13410 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30       p->xCmp = 0
13420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13430 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
13440 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13450 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
13460 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
13470 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   1);.  if( pColl
13480 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13490 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
134a0 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
134b0 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
134c0 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
134d0 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
134e0 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
134f0 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
13500 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
13510 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
13520 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
13530 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
13540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13550 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
13560 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73  is array defines
13570 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
13580 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75  ds on limit valu
13590 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74  es.  The.** init
135a0 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20  ializer must be 
135b0 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74  kept in sync wit
135c0 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  h the SQLITE_LIM
135d0 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73  IT_*.** #defines
135e0 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a   in sqlite3.h..*
135f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
13600 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20  nt aHardLimit[] 
13610 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  = {.  SQLITE_MAX
13620 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
13630 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
13640 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
13650 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f  OLUMN,.  SQLITE_
13660 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a  MAX_EXPR_DEPTH,.
13670 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d    SQLITE_MAX_COM
13680 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20  POUND_SELECT,.  
13690 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
136a0 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  OP,.  SQLITE_MAX
136b0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20  _FUNCTION_ARG,. 
136c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
136d0 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  CHED,.  SQLITE_M
136e0 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
136f0 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
13700 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
13710 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d  MBER,      /* IM
13720 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32  P: R-38091-32352
13730 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58   */.  SQLITE_MAX
13740 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a  _TRIGGER_DEPTH,.
13750 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52    SQLITE_MAX_WOR
13760 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a  KER_THREADS,.};.
13770 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
13780 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
13790 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
137a0 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
137b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
137c0 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
137d0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
137e0 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
137f0 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
13800 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13810 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
13820 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13830 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
13840 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
13850 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
13860 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
13870 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
13880 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
13890 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
138a0 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
138b0 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
138c0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
138d0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
138e0 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
138f0 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
13900 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
13910 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
13920 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
13930 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13940 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
13950 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13960 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
13970 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
13980 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13990 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
139a0 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
139b0 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37 0a  UNCTION_ARG>127.
139c0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
139d0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
139e0 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
139f0 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69 66  0 and 127.#endif
13a00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13a10 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51  ATTACHED<0 || SQ
13a20 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
13a30 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53 51  D>125.# error SQ
13a40 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
13a50 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
13a60 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e 64  n 0 and 125.#end
13a70 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13a80 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
13a90 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  ENGTH<1.# error 
13aa0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
13ab0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d  PATTERN_LENGTH m
13ac0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
13ad0 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
13ae0 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33  ITE_MAX_COLUMN>3
13af0 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  2767.# error SQL
13b00 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d  ITE_MAX_COLUMN m
13b10 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33  ust not exceed 3
13b20 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20  2767.#endif.#if 
13b30 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
13b40 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72  ER_DEPTH<1.# err
13b50 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  or SQLITE_MAX_TR
13b60 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74  IGGER_DEPTH must
13b70 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
13b80 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13b90 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13ba0 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ADS<0 || SQLITE_
13bb0 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
13bc0 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53 51  DS>50.# error SQ
13bd0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
13be0 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65 20  THREADS must be 
13bf0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35 30  between 0 and 50
13c00 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
13c10 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
13c20 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65   of a limit.  Re
13c30 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c  port the old val
13c40 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76  ue..** If an inv
13c50 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78  alid limit index
13c60 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65   is supplied, re
13c70 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65  port -1..** Make
13c80 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20   no changes but 
13c90 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65  still report the
13ca0 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68   old value if th
13cb0 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69  e.** new limit i
13cc0 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  s negative..**.*
13cd0 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69  * A new lower li
13ce0 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72  mit does not shr
13cf0 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e  ink existing con
13d00 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d  structs..** It m
13d10 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e  erely prevents n
13d20 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68  ew constructs th
13d30 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c 69  at exceed the li
13d40 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d  mit.** from form
13d50 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
13d60 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65  te3_limit(sqlite
13d70 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74  3 *db, int limit
13d80 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74  Id, int newLimit
13d90 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69  ){.  int oldLimi
13da0 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
13db0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
13dc0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
13dd0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
13de0 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
13df0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
13e00 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  PT;.    return -
13e10 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  1;.  }.#endif.. 
13e20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
13e30 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46   R-30189-54097 F
13e40 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61  or each limit ca
13e50 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49  tegory SQLITE_LI
13e60 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68  MIT_NAME.  ** th
13e70 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75 70  ere is a hard up
13e80 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74  per bound set at
13e90 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79   compile-time by
13ea0 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f   a C preprocesso
13eb0 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c  r.  ** macro cal
13ec0 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e  led SQLITE_MAX_N
13ed0 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49  AME. (The "_LIMI
13ee0 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  T_" in the name 
13ef0 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20  is changed to.  
13f00 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a  ** "_MAX_".).  *
13f10 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  /.  assert( aHar
13f20 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
13f30 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  MIT_LENGTH]==SQL
13f40 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29  ITE_MAX_LENGTH )
13f50 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13f60 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
13f70 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d  MIT_SQL_LENGTH]=
13f80 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f  =SQLITE_MAX_SQL_
13f90 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
13fa0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13fb0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
13fc0 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  MN]==SQLITE_MAX_
13fd0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65  COLUMN );.  asse
13fe0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13ff0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
14000 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
14010 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29  MAX_EXPR_DEPTH )
14020 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
14030 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
14040 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
14050 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ECT]==SQLITE_MAX
14060 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
14070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
14080 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14090 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53  IMIT_VDBE_OP]==S
140a0 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
140b0 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  P );.  assert( a
140c0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
140d0 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
140e0 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ARG]==SQLITE_MAX
140f0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b  _FUNCTION_ARG );
14100 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
14110 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
14120 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51  IT_ATTACHED]==SQ
14130 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
14140 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
14150 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
14160 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
14170 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20  ERN_LENGTH]==.  
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
141b0 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
141c0 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  TERN_LENGTH );. 
141d0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
141e0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
141f0 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
14200 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  ]==SQLITE_MAX_VA
14210 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a  RIABLE_NUMBER);.
14220 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
14230 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
14240 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d  T_TRIGGER_DEPTH]
14250 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  ==SQLITE_MAX_TRI
14260 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  GGER_DEPTH );.  
14270 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
14280 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14290 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d  WORKER_THREADS]=
142a0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b  =SQLITE_MAX_WORK
142b0 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20 20  ER_THREADS );.  
142c0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c  assert( SQLITE_L
142d0 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
142e0 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c  ADS==(SQLITE_N_L
142f0 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69  IMIT-1) );...  i
14300 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
14310 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
14320 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
14330 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
14340 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
14350 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
14360 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
14370 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
14380 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
14390 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a  -52476-28732 */.
143a0 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
143b0 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
143c0 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
143d0 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
143e0 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f  mit[limitId];  /
143f0 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32  * IMP: R-51463-2
14400 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  5634 */.    }.  
14410 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d    db->aLimit[lim
14420 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74  itId] = newLimit
14430 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
14440 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  ldLimit;        
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14460 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34  IMP: R-53341-354
14470 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  19 */.}../*.** T
14480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14490 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f  used to parse bo
144a0 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d  th URIs and non-
144b0 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61  URI filenames pa
144c0 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75  ssed by the.** u
144d0 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74  ser to API funct
144e0 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65  ions sqlite3_ope
144f0 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  n() or sqlite3_o
14500 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f  pen_v2(), and fo
14510 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52  r database.** UR
14520 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  Is specified as 
14530 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73  part of ATTACH s
14540 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
14550 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
14560 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
14570 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
14580 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
14590 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c  se (or.** a NULL
145a0 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20   to signify the 
145b0 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20  default VFS) if 
145c0 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74  the URI does not
145d0 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d   contain a "vfs=
145e0 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61  xxx".** query pa
145f0 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63  rameter. The sec
14600 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e  ond argument con
14610 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f  tains the URI (o
14620 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  r non-URI filena
14630 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57  me).** itself. W
14640 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
14650 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  n is called the 
14660 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65  *pFlags variable
14670 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
14680 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ** the default f
14690 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65  lags to open the
146a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
146b0 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65   with. The value
146c0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70   stored in.** *p
146d0 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64  Flags may be upd
146e0 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ated before retu
146f0 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49  rning if the URI
14700 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69   filename contai
14710 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78  ns .** "cache=xx
14720 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22  x" or "mode=xxx"
14730 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
14740 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  s..**.** If succ
14750 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
14760 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
14770 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56  n this case *ppV
14780 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  fs is set to poi
14790 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53  nt to.** the VFS
147a0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
147b0 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
147c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
147d0 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74  *pzFile is set t
147e0 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  o.** point to a 
147f0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
14800 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  g the name of th
14810 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20  e file to open. 
14820 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
14830 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
14840 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
14850 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71  entually call sq
14860 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
14870 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
14880 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  buffer..**.** If
14890 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
148a0 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65  , then an SQLite
148b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
148c0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45  eturned and *pzE
148d0 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20  rrMsg.** may be 
148e0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
148f0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
14900 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c  ing an English l
14910 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a  anguage error .*
14920 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
14930 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
14940 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
14950 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
14960 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
14970 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e  buffer by callin
14980 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
14990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
149a0 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73  ParseUri(.  cons
149b0 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
149c0 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Vfs,        /* V
149d0 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20  FS to use if no 
149e0 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20  "vfs=xxx" query 
149f0 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  option */.  cons
14a00 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20  t char *zUri,   
14a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14a20 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52  ul-terminated UR
14a30 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20  I to parse */.  
14a40 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46  unsigned int *pF
14a50 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
14a60 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54  /* IN/OUT: SQLIT
14a70 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
14a80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
14a90 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20  s **ppVfs,      
14aa0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46        /* OUT: VF
14ab0 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63  S to use */ .  c
14ac0 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20  har **pzFile,   
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ae0 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20  * OUT: Filename 
14af0 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49  component of URI
14b00 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
14b10 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
14b20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
14b30 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20  ror message (if 
14b40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a  rc!=SQLITE_OK) *
14b50 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
14b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
14b70 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20  igned int flags 
14b80 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e  = *pFlags;.  con
14b90 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
14ba0 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63  zDefaultVfs;.  c
14bb0 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
14bc0 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69  ar c;.  int nUri
14bd0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
14be0 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73  30(zUri);..  ass
14bf0 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d  ert( *pzErrMsg==
14c00 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c  0 );..  if( ((fl
14c10 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
14c20 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20 20  N_URI)          
14c30 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 37     /* IMP: R-487
14c40 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20 20  25-32206 */.    
14c50 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
14c60 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
14c70 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50 3a  OpenUri) /* IMP:
14c80 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20 2a   R-51689-46548 *
14c90 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20  /.   && nUri>=5 
14ca0 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20  && memcmp(zUri, 
14cb0 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f  "file:", 5)==0 /
14cc0 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33  * IMP: R-57884-3
14cd0 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  7496 */.  ){.   
14ce0 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
14cf0 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14d10 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77  * Parser state w
14d20 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20  hen parsing URI 
14d30 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20  */.    int iIn; 
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d50 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68       /* Input ch
14d60 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
14d70 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20  .    int iOut = 
14d80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14d90 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61     /* Output cha
14da0 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
14db0 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d 20      u64 nByte = 
14dc0 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20  nUri+2;         
14dd0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
14de0 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
14df0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
14e00 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f  sure the SQLITE_
14e10 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73  OPEN_URI flag is
14e20 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65   set to indicate
14e30 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65   to the VFS xOpe
14e40 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  n .    ** method
14e50 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20   that there may 
14e60 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  be extra paramet
14e70 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ers following th
14e80 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f  e file-name.  */
14e90 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
14ea0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a  LITE_OPEN_URI;..
14eb0 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69      for(iIn=0; i
14ec0 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20  In<nUri; iIn++) 
14ed0 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69  nByte += (zUri[i
14ee0 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a  In]=='&');.    z
14ef0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
14f00 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
14f10 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
14f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14f30 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20 20  OMEM_BKPT;..    
14f40 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20  iIn = 5;.#ifdef 
14f50 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49  SQLITE_ALLOW_URI
14f60 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69  _AUTHORITY.    i
14f70 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
14f80 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20  5, "///", 3)==0 
14f90 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
14fa0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;.      /* The f
14fb0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69  ollowing conditi
14fc0 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20 77  on causes URIs w
14fd0 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67  ith five leading
14fe0 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
14ff0 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65      ** like file
15000 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20  ://///host/path 
15010 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  to be converted 
15020 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f  into UNCs like /
15030 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20  /host/path..    
15040 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74    ** The correct
15050 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e   URI for that UN
15060 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f  C has only two o
15070 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f  r four leading /
15080 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
15090 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74    ** file://host
150a0 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f  /path or file://
150b0 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75  //host/path.  Bu
150c0 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73  t 5 leading slas
150d0 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20 20  hes is a .      
150e0 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c  ** common error,
150f0 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f   we are told, so
15100 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73   we handle it as
15110 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e   a special case.
15120 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74   */.      if( st
15130 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f  rncmp(zUri+7, "/
15140 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49  //", 3)==0 ){ iI
15150 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65  n++; }.    }else
15160 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
15170 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73  i+5, "//localhos
15180 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20  t/", 12)==0 ){. 
15190 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20       iIn = 16;. 
151a0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f     }.#else.    /
151b0 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63  * Discard the sc
151c0 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69  heme and authori
151d0 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74  ty segments of t
151e0 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69  he URI. */.    i
151f0 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20  f( zUri[5]=='/' 
15200 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20  && zUri[6]=='/' 
15210 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
15220 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
15230 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
15240 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e  [iIn]!='/' ) iIn
15250 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49  ++;.      if( iI
15260 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36  n!=7 && (iIn!=16
15270 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61   || memcmp("loca
15280 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d  lhost", &zUri[7]
15290 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 9)) ){.       
152a0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
152b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e  ite3_mprintf("in
152c0 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72  valid uri author
152d0 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20  ity: %.*s", .   
152e0 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20           iIn-7, 
152f0 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20  &zUri[7]);.     
15300 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
15310 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
15320 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
15330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15340 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
15350 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  opy the filename
15360 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70   and any query p
15370 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74  arameters into t
15380 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e  he zFile buffer.
15390 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20   .    ** Decode 
153a0 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73  %HH escape codes
153b0 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20   along the way. 
153c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
153d0 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c  ithin this loop,
153e0 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65   variable eState
153f0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30   may be set to 0
15400 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64  , 1 or 2, depend
15410 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ing.    ** on th
15420 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
15430 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  t. As follows:. 
15440 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30     **.    **   0
15450 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e  : Parsing file-n
15460 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a  ame..    **   1:
15470 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65   Parsing name se
15480 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
15490 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
154a0 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  meter..    **   
154b0 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65  2: Parsing value
154c0 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
154d0 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
154e0 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f  arameter..    */
154f0 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b  .    eState = 0;
15500 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
15510 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
15520 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20  & c!='#' ){.    
15530 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69    iIn++;.      i
15540 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20  f( c=='%' .     
15550 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
15560 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20  igit(zUri[iIn]) 
15570 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
15580 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
15590 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29  iIn+1]) .      )
155a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63  {.        int oc
155b0 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65  tet = (sqlite3He
155c0 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
155d0 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20  +]) << 4);.     
155e0 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69     octet += sqli
155f0 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
15600 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20  [iIn++]);..     
15610 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74     assert( octet
15620 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36  >=0 && octet<256
15630 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
15640 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  octet==0 ){.    
15650 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
15660 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
15670 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73  en "%00" appears
15680 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e   within the URI.
15690 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   In this.       
156a0 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67     ** case we ig
156b0 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e  nore all text in
156c0 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
156d0 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65  f the path, name
156e0 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   or.          **
156f0 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79   value currently
15700 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53   being parsed. S
15710 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72  o ignore the cur
15720 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20  rent character. 
15730 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
15740 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74  skip to the next
15750 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22   "?", "=" or "&"
15760 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
15770 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
15780 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
15790 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
157a0 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  #' .            
157b0 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20    && (eState!=0 
157c0 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20  || c!='?').     
157d0 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
157e0 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d  ate!=1 || (c!='=
157f0 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20  ' && c!='&')).  
15800 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
15810 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d  eState!=2 || c!=
15820 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29  '&').          )
15830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49  {.            iI
15840 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
15850 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
15860 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
15870 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74         c = octet
15880 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15890 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28  ( eState==1 && (
158a0 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27  c=='&' || c=='='
158b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
158c0 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d   zFile[iOut-1]==
158d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
158e0 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f  * An empty optio
158f0 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74  n name. Ignore t
15900 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67  his option altog
15910 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ether. */.      
15920 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
15930 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
15940 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69  ]!='#' && zUri[i
15950 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e  In-1]!='&' ) iIn
15960 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
15970 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15980 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
15990 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='&' ){.        
159a0 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
159b0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
159c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
159d0 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20   eState = 2;.   
159e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
159f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
15a00 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30  e if( (eState==0
15a10 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28   && c=='?') || (
15a20 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d  eState==2 && c==
15a30 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '&') ){.        
15a40 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65  c = 0;.        e
15a50 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
15a60 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69   }.      zFile[i
15a70 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
15a80 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  }.    if( eState
15a90 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74  ==1 ) zFile[iOut
15aa0 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
15ab0 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15ac0 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
15ad0 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
15ae0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
15af0 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20   there were any 
15b00 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65  options specifie
15b10 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  d that should be
15b20 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20   interpreted .  
15b30 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f    ** here. Optio
15b40 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ns that are inte
15b50 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63  rpreted here inc
15b60 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74  lude "vfs" and t
15b70 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  hose that.    **
15b80 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66   correspond to f
15b90 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65  lags that may be
15ba0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
15bb0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
15bc0 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20  .    ** method. 
15bd0 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  */.    zOpt = &z
15be0 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  File[sqlite3Strl
15bf0 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a  en30(zFile)+1];.
15c00 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b      while( zOpt[
15c10 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
15c20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74  nOpt = sqlite3St
15c30 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20  rlen30(zOpt);.  
15c40 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d      char *zVal =
15c50 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a   &zOpt[nOpt+1];.
15c60 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d        int nVal =
15c70 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15c80 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69  (zVal);..      i
15c90 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65  f( nOpt==3 && me
15ca0 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74  mcmp("vfs", zOpt
15cb0 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
15cc0 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a     zVfs = zVal;.
15cd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15ce0 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e       struct Open
15cf0 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20  Mode {.         
15d00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
15d10 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
15d20 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61  de;.        } *a
15d30 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mode = 0;.      
15d40 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70    char *zModeTyp
15d50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
15d60 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nt mask = 0;.   
15d70 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
15d80 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   0;..        if(
15d90 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63   nOpt==5 && memc
15da0 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74  mp("cache", zOpt
15db0 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 5)==0 ){.     
15dc0 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
15dd0 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63  ct OpenMode aCac
15de0 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  heMode[] = {.   
15df0 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72           { "shar
15e00 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ed",  SQLITE_OPE
15e10 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
15e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
15e30 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45  private", SQLITE
15e40 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
15e50 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
15e60 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
15e70 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
15e80 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
15e90 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
15ea0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  E|SQLITE_OPEN_PR
15eb0 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20  IVATECACHE;.    
15ec0 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43        aMode = aC
15ed0 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20  acheMode;.      
15ee0 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
15ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
15f00 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b  eType = "cache";
15f10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15f20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26     if( nOpt==4 &
15f30 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c  & memcmp("mode",
15f40 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a   zOpt, 4)==0 ){.
15f50 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
15f60 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
15f70 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b   aOpenMode[] = {
15f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
15f90 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ro",  SQLITE_OPE
15fa0 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
15fb0 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22            { "rw"
15fc0 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
15fd0 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20  EADWRITE }, .   
15fe0 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22           { "rwc"
15ff0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
16000 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
16010 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
16020 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d              { "m
16030 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f  emory", SQLITE_O
16040 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20  PEN_MEMORY },.  
16050 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
16060 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
16070 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
16080 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
16090 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f  ADONLY | SQLITE_
160a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
160d0 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
160e0 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20  OPEN_MEMORY;.   
160f0 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
16100 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20  OpenMode;.      
16110 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
16120 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   & flags;.      
16130 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
16140 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20  "access";.      
16150 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
16160 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20   aMode ){.      
16170 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
16180 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20       int mode = 
16190 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
161a0 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a  (i=0; aMode[i].z
161b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
161c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
161d0 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a  z = aMode[i].z;.
161e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
161f0 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  nVal==sqlite3Str
16200 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d  len30(z) && 0==m
16210 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e  emcmp(zVal, z, n
16220 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
16230 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f        mode = aMo
16240 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20  de[i].mode;.    
16250 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
16260 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
16270 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16280 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30       if( mode==0
16290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
162a0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
162b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
162c0 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73  such %s mode: %s
162d0 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56  ", zModeType, zV
162e0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
162f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
16300 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
16310 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
16320 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
16330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d            if( (m
16340 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ode & ~SQLITE_OP
16350 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74  EN_MEMORY)>limit
16360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16370 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
16380 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
16390 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  mode not allowed
163a0 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
163d0 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
163e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
163f0 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  = SQLITE_PERM;. 
16400 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
16410 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
16420 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16430 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c       flags = (fl
16440 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d  ags & ~mask) | m
16450 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ode;.        }. 
16460 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f       }..      zO
16470 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b  pt = &zVal[nVal+
16480 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  1];.    }..  }el
16490 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  se{.    zFile = 
164a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
164b0 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66  (nUri+2);.    if
164c0 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
164d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
164e0 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  KPT;.    memcpy(
164f0 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72  zFile, zUri, nUr
16500 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55  i);.    zFile[nU
16510 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ri] = '\0';.    
16520 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20  zFile[nUri+1] = 
16530 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20  '\0';.    flags 
16540 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
16550 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56  URI;.  }..  *ppV
16560 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
16570 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69  _find(zVfs);.  i
16580 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a  f( *ppVfs==0 ){.
16590 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
165a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
165b0 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73  "no such vfs: %s
165c0 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63  ", zVfs);.    rc
165d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
165e0 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f  .  }. parse_uri_
165f0 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
16600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16610 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
16620 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  le);.    zFile =
16630 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67   0;.  }.  *pFlag
16640 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a  s = flags;.  *pz
16650 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20  File = zFile;.  
16660 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
16670 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16680 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20  e does the work 
16690 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74  of opening a dat
166a0 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20  abase on behalf 
166b0 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  of.** sqlite3_op
166c0 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  en() and sqlite3
166d0 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64  _open16(). The d
166e0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
166f0 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a   "zFilename"  .*
16700 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64  * is UTF-8 encod
16710 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
16720 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a  t openDatabase(.
16730 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
16740 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61  ilename, /* Data
16750 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54  base filename UT
16760 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20  F-8 encoded */. 
16770 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
16780 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
16790 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73  Returned databas
167a0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e  e handle */.  un
167b0 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
167c0 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f  ,    /* Operatio
167d0 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  nal flags */.  c
167e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
167f0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16800 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   the VFS to use 
16810 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
16820 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
16830 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
16840 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c   allocated handl
16850 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
16860 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
16870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16880 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
16890 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65  int isThreadsafe
168a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
168b0 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65  /* True for thre
168c0 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f  adsafe connectio
168d0 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  ns */.  char *zO
168e0 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pen = 0;        
168f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
16900 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ame argument to 
16910 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65  pass to BtreeOpe
16920 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  n() */.  char *z
16930 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20  ErrMsg = 0;     
16940 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
16950 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  r message from s
16960 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29  qlite3ParseUri()
16970 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
16980 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
16990 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d  MOR.  if( ppDb==
169a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
169b0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
169c0 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20  endif.  *ppDb = 
169d0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
169e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
169f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
16a00 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
16a10 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
16a20 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  c;.#endif..  /* 
16a30 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69  Only allow sensi
16a40 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
16a50 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
16a60 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20  flags argument. 
16a70 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20   .  ** Throw an 
16a80 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e  error if any non
16a90 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69  -sense combinati
16aa0 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  on is used.  If 
16ab0 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62  we.  ** do not b
16ac0 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d  lock illegal com
16ad0 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20  binations here, 
16ae0 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72  it could trigger
16af0 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73  .  ** assert() s
16b00 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65  tatements in dee
16b10 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e  per layers.  Sen
16b20 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
16b30 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a  ns.  ** are:.  *
16b40 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49  *.  **  1:  SQLI
16b50 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
16b60 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54  .  **  2:  SQLIT
16b70 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16b80 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54  .  **  6:  SQLIT
16b90 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16ba0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
16bb0 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73  REATE.  */.  ass
16bc0 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
16bd0 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78  _READONLY  == 0x
16be0 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  01 );.  assert( 
16bf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16c00 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b  WRITE == 0x02 );
16c10 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
16c20 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20  E_OPEN_CREATE   
16c30 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65   == 0x04 );.  te
16c40 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
16c50 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20  gs&7))==0x02 ); 
16c60 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20  /* READONLY */. 
16c70 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
16c80 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20  flags&7))==0x04 
16c90 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
16ca0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
16cb0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
16cc0 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x40 ); /* READWR
16cd0 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a  ITE | CREATE */.
16ce0 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67    if( ((1<<(flag
16cf0 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30  s&7)) & 0x46)==0
16d00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16d10 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
16d20 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35  T;  /* IMP: R-65
16d30 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d  497-44594 */.  }
16d40 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
16d50 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
16d60 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
16d70 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
16d80 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
16d90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16da0 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
16db0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
16dc0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
16dd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
16de0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
16df0 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
16e00 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
16e10 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
16e20 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
16e30 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
16e40 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  x;.  }.  if( fla
16e50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
16e60 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b  _PRIVATECACHE ){
16e70 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
16e80 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
16e90 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20  DCACHE;.  }else 
16ea0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
16eb0 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
16ec0 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
16ed0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
16ee0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
16ef0 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  HE;.  }..  /* Re
16f00 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74  move harmful bit
16f10 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73  s from the flags
16f20 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a   parameter.  **.
16f30 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    ** The SQLITE_
16f40 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64  OPEN_NOMUTEX and
16f50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
16f60 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72  LMUTEX flags wer
16f70 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  e.  ** dealt wit
16f80 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  h in the previou
16f90 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42  s code block.  B
16fa0 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68  esides these, th
16fb0 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69  e only.  ** vali
16fc0 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f  d input flags fo
16fd0 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
16fe0 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f  2() are SQLITE_O
16ff0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20  PEN_READONLY,.  
17000 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ** SQLITE_OPEN_R
17010 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45  EADWRITE, SQLITE
17020 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51  _OPEN_CREATE, SQ
17030 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
17040 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49  CACHE,.  ** SQLI
17050 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
17060 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72  ACHE, and some r
17070 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53  eserved bits.  S
17080 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
17090 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
170a0 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
170b0 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
170c0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
170d0 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
170e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
170f0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17110 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
17120 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
17130 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
17140 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
17150 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
17160 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
17170 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
17180 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
17190 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
171b0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
171c0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
171d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
171e0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
171f0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
17200 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
17210 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
17230 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
17240 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
17250 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
17260 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  ULLMUTEX |.     
17270 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17280 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20  _OPEN_WAL.      
17290 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20         );..  /* 
172a0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
172b0 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
172c0 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
172d0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
172e0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20  sizeof(sqlite3) 
172f0 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
17300 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
17310 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64  ;.  if( isThread
17320 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  safe ){.    db->
17330 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
17340 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
17350 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
17360 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
17370 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
17380 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
17390 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
173a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
173b0 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
173c0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
173d0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
173e0 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
173f0 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
17400 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d  nDb = 2;.  db->m
17410 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
17420 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e  GIC_BUSY;.  db->
17430 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
17440 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tic;..  assert( 
17450 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
17460 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
17470 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
17480 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
17490 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
174a0 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
174b0 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
174c0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
174d0 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49  _THREADS] = SQLI
174e0 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45  TE_DEFAULT_WORKE
174f0 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d  R_THREADS;.  db-
17500 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
17510 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76  .  db->nextAutov
17520 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73  ac = -1;.  db->s
17530 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47  zMmap = sqlite3G
17540 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
17550 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61  ap;.  db->nextPa
17560 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62  gesize = 0;.  db
17570 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
17580 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20   = 0x7FFFFFFF;. 
17590 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
175a0 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
175b0 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62  es | SQLITE_Enab
175c0 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49  leTrigger | SQLI
175d0 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69  TE_CacheSpill.#i
175e0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
175f0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
17600 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51  TIC_INDEX) || SQ
17610 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17620 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20  OMATIC_INDEX.   
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17640 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
17650 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
17660 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46  TE_DEFAULT_CKPTF
17670 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20  ULLFSYNC.       
17680 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17690 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63  TE_CkptFullFSync
176a0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
176b0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
176c0 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20  FORMAT<4.       
176d0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
176e0 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
176f0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
17700 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41  QLITE_ENABLE_LOA
17710 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17730 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73  QLITE_LoadExtens
17740 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ion.#endif.#if S
17750 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45  QLITE_DEFAULT_RE
17760 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53  CURSIVE_TRIGGERS
17770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17780 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72    | SQLITE_RecTr
17790 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69  iggers.#endif.#i
177a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
177b0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
177c0 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45  _KEYS) && SQLITE
177d0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
177e0 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20  _KEYS.          
177f0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
17800 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64  ForeignKeys.#end
17810 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
17820 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e  QLITE_REVERSE_UN
17830 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29  ORDERED_SELECTS)
17840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17850 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72    | SQLITE_Rever
17860 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 23  seOrder.#endif.#
17870 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
17880 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
17890 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
178b0 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
178c0 43 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  Ck.#endif.#if de
178d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
178e0 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a  BLE_FTS3_TOKENIZ
178f0 45 52 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER).            
17900 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 74       | SQLITE_Ft
17910 73 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64  s3Tokenizer.#end
17920 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c  if.      ;.  sql
17930 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
17940 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66  ->aCollSeq);.#if
17950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17960 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
17970 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
17980 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
17990 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
179a0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
179b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
179c0 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f  INARY. BINARY wo
179d0 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46  rks for both UTF
179e0 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d  -8.  ** and UTF-
179f0 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72  16, so add a ver
17a00 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f  sion for each to
17a10 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63   avoid any unnec
17a20 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76  essary.  ** conv
17a30 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ersions. The onl
17a40 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e  y error that can
17a50 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61   occur here is a
17a60 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
17a70 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49  e..  **.  ** EVI
17a80 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38  DENCE-OF: R-5278
17a90 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20 64  6-44878 SQLite d
17aa0 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75 69  efines three bui
17ab0 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a  lt-in collating.
17ac0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a    ** functions:.
17ad0 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
17ae0 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74  lation(db, sqlit
17af0 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c  e3StrBINARY, SQL
17b00 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e  ITE_UTF8, 0, bin
17b10 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
17b20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
17b30 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49  db, sqlite3StrBI
17b40 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46  NARY, SQLITE_UTF
17b50 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16BE, 0, binColl
17b60 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
17b70 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
17b80 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
17b90 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
17ba0 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
17bb0 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
17bc0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43  llation(db, "NOC
17bd0 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ASE", SQLITE_UTF
17be0 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c  8, 0, nocaseColl
17bf0 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20  atingFunc, 0);. 
17c00 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
17c10 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51  (db, "RTRIM", SQ
17c20 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
17c30 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  *)1, binCollFunc
17c40 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
17c50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
17c60 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
17c70 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56  out;.  }.  /* EV
17c80 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33  IDENCE-OF: R-083
17c90 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65 66  08-17224 The def
17ca0 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
17cb0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a  unction for all.
17cc0 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73 20    ** strings is 
17cd0 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20  BINARY. .  */.  
17ce0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20  db->pDfltColl = 
17cf0 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
17d00 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
17d10 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49  F8, sqlite3StrBI
17d20 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73 65  NARY, 0);.  asse
17d30 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  rt( db->pDfltCol
17d40 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61  l!=0 );..  /* Pa
17d50 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rse the filename
17d60 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a  /URI argument. *
17d70 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67  /.  db->openFlag
17d80 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20  s = flags;.  rc 
17d90 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  = sqlite3ParseUr
17da0 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  i(zVfs, zFilenam
17db0 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e  e, &flags, &db->
17dc0 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a  pVfs, &zOpen, &z
17dd0 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
17de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17df0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17e00 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69 74  TE_NOMEM ) sqlit
17e10 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
17e20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17e30 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20  WithMsg(db, rc, 
17e40 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
17e50 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20   0, zErrMsg);.  
17e60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17e70 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74  ErrMsg);.    got
17e80 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
17e90 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
17ea0 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73   backend databas
17eb0 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63  e driver */.  rc
17ec0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
17ed0 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f  pen(db->pVfs, zO
17ee0 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44  pen, db, &db->aD
17ef0 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20  b[0].pBt, 0,.   
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c       flags | SQL
17f20 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
17f30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
17f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
17f60 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  RR_NOMEM ){.    
17f70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17f80 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
17f90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17fa0 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f  (db, rc);.    go
17fb0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17fc0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
17fd0 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30  eEnter(db->aDb[0
17fe0 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
17ff0 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[0].pSchema = s
18000 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
18010 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  db, db->aDb[0].p
18020 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e  Bt);.  if( !db->
18030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45  mallocFailed ) E
18040 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f  NC(db) = SCHEMA_
18050 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ENC(db);.  sqlit
18060 65 33 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d  e3BtreeLeave(db-
18070 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
18080 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
18090 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
180a0 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20  maGet(db, 0);.. 
180b0 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   /* The default 
180c0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72  safety_level for
180d0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
180e0 73 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72 20  se is FULL; for 
180f0 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61  the temp.  ** da
18100 74 61 62 61 73 65 20 69 74 20 69 73 20 4f 46 46  tabase it is OFF
18110 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
18120 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
18130 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
18140 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
18150 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
18160 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
18170 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f  _level = SQLITE_
18180 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
18190 4f 55 53 2b 31 3b 0a 20 20 64 62 2d 3e 61 44 62  OUS+1;.  db->aDb
181a0 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
181b0 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
181c0 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
181d0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
181e0 53 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e 6d 61  S_OFF;..  db->ma
181f0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
18200 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
18210 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18220 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
18230 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
18240 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
18250 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
18260 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
18270 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
18280 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
18290 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
182a0 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
182b0 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
182c0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
182d0 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
182e0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
182f0 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
18300 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67  K);.  sqlite3Reg
18310 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74 69  isterPerConnecti
18320 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  onBuiltinFunctio
18330 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  ns(db);..  /* Lo
18340 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ad automatic ext
18350 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73  ensions - extens
18360 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  ions that have b
18370 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20  een registered. 
18380 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71   ** using the sq
18390 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f  lite3_automatic_
183a0 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e  extension() API.
183b0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
183c0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
183d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
183e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
183f0 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65  ite3AutoLoadExte
18400 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20  nsions(db);.    
18410 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
18420 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66  code(db);.    if
18430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18440 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  ){.      goto op
18450 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
18460 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
18470 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
18480 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18490 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
184a0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
184b0 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
184c0 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
184d0 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
184e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
184f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18500 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
18510 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18520 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18530 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
18540 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
18550 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
18560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
18570 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
18580 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
18590 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
185a0 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  3 /* automatical
185b0 6c 79 20 64 65 66 69 6e 65 64 20 62 79 20 53 51  ly defined by SQ
185c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
185d0 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   */.  if( !db->m
185e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
185f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18610 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts3Init(db);.  
18620 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
18630 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
18640 54 53 35 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS5.  if( !db->m
18650 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
18660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18670 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18680 46 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts5Init(db);.  
18690 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
186a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
186b0 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  CU.  if( !db->ma
186c0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
186d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
186e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
186f0 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  cuInit(db);.  }.
18700 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
18710 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52  QLITE_ENABLE_RTR
18720 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  EE.  if( !db->ma
18730 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
18740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
18750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74    rc = sqlite3Rt
18760 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  reeInit(db);.  }
18770 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
18780 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
18790 53 54 41 54 5f 56 54 41 42 0a 20 20 69 66 28 20  STAT_VTAB.  if( 
187a0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
187b0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
187c0 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
187d0 6c 69 74 65 33 44 62 73 74 61 74 52 65 67 69 73  lite3DbstatRegis
187e0 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  ter(db);.  }.#en
187f0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
18800 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a  TE_ENABLE_JSON1.
18810 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
18820 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
18830 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
18840 63 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31  c = sqlite3Json1
18850 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
18860 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c  ndif..  /* -DSQL
18870 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
18880 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73  ING_MODE=1 makes
18890 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64   EXCLUSIVE the d
188a0 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
188b0 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c   ** mode.  -DSQL
188c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
188d0 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20  ING_MODE=0 make 
188e0 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
188f0 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
18900 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74  mode.  Doing not
18910 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f  hing at all also
18920 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68   makes NORMAL th
18930 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  e default..  */.
18940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
18950 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
18960 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  DE.  db->dfltLoc
18970 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44  kMode = SQLITE_D
18980 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
18990 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ODE;.  sqlite3Pa
189a0 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73  gerLockingMode(s
189b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
189c0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
189d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
189e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
189f0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18a00 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66  NG_MODE);.#endif
18a10 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c  ..  if( rc ) sql
18a20 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
18a30 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20  );..  /* Enable 
18a40 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61  the lookaside-ma
18a50 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a  lloc subsystem *
18a60 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  /.  setupLookasi
18a70 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65  de(db, 0, sqlite
18a80 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
18a90 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20  Lookaside,.     
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ab0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
18ac0 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
18ad0 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77  e);..  sqlite3_w
18ae0 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
18af0 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46  t(db, SQLITE_DEF
18b00 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45  AULT_WAL_AUTOCHE
18b10 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64  CKPOINT);..opend
18b20 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20  b_out:.  if( db 
18b30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
18b40 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69  b->mutex!=0 || i
18b50 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20  sThreadsafe==0. 
18b60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
18b70 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18b80 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
18b90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
18ba0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
18bb0 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tex);.  }.  rc =
18bc0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
18bd0 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
18be0 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  db!=0 || rc==SQL
18bf0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69  ITE_NOMEM );.  i
18c00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
18c10 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MEM ){.    sqlit
18c20 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
18c30 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    db = 0;.  }els
18c40 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
18c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  _OK ){.    db->m
18c60 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
18c70 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20  GIC_SICK;.  }.  
18c80 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64  *ppDb = db;.#ifd
18c90 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18ca0 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
18cb0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18cc0 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
18cd0 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62   /* Opening a db
18ce0 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
18cf0 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
18d00 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f  sed 0. */.    vo
18d10 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74  id *pArg = sqlit
18d20 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
18d30 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73  SqllogArg;.    s
18d40 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18d50 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c  ig.xSqllog(pArg,
18d60 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   db, zFilename, 
18d70 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  0);.  }.#endif.#
18d80 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
18d90 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69  E_HAS_CODEC).  i
18da0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18db0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
18dc0 61 72 20 2a 7a 48 65 78 4b 65 79 20 3d 20 73 71  ar *zHexKey = sq
18dd0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
18de0 74 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65 78 6b  ter(zOpen, "hexk
18df0 65 79 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 48  ey");.    if( zH
18e00 65 78 4b 65 79 20 26 26 20 7a 48 65 78 4b 65 79  exKey && zHexKey
18e10 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 75 38 20  [0] ){.      u8 
18e20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74  iByte;.      int
18e30 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   i;.      char z
18e40 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66  Key[40];.      f
18e50 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b  or(i=0, iByte=0;
18e60 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a   i<sizeof(zKey)*
18e70 32 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64  2 && sqlite3Isxd
18e80 69 67 69 74 28 7a 48 65 78 4b 65 79 5b 69 5d 29  igit(zHexKey[i])
18e90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18ea0 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c  iByte = (iByte<<
18eb0 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54  4) + sqlite3HexT
18ec0 6f 49 6e 74 28 7a 48 65 78 4b 65 79 5b 69 5d 29  oInt(zHexKey[i])
18ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
18ee0 26 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f  &1)!=0 ) zKey[i/
18ef0 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20  2] = iByte;.    
18f00 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
18f10 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20  3_key_v2(db, 0, 
18f20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20  zKey, i/2);.    
18f30 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  }.  }.#endif.  s
18f40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65  qlite3_free(zOpe
18f50 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  n);.  return rc 
18f60 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  & 0xff;.}../*.**
18f70 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
18f80 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
18f90 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
18fa0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
18fb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
18fc0 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
18fd0 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
18fe0 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
18ff0 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19010 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
19020 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
19030 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
19040 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
19050 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
19060 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
19070 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
19080 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
19090 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
190a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
190b0 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
190c0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
190d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
190e0 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
190f0 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
19100 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
19110 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
19120 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
19130 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
19140 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
19150 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
19160 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
19170 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19180 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
19190 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
191a0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
191b0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
191c0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
191d0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
191e0 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
191f0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
19200 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
19210 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
19220 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
19230 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
19240 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
19250 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  al;.  int rc;..#
19260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19270 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
19280 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
19290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
192a0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
192b0 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
192c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
192d0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
192e0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
192f0 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
19300 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
19310 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  dif.  if( zFilen
19320 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61  ame==0 ) zFilena
19330 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b  me = "\000\000";
19340 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
19350 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
19360 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
19370 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69  tr(pVal, -1, zFi
19380 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  lename, SQLITE_U
19390 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
193a0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46  TE_STATIC);.  zF
193b0 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74  ilename8 = sqlit
193c0 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
193d0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
193e0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38    if( zFilename8
193f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
19400 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
19410 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20  ame8, ppDb,.    
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
19440 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
19450 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
19460 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
19470 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  pDb || rc==SQLIT
19480 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69  E_NOMEM );.    i
19490 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
194a0 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72   && !DbHasProper
194b0 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f  ty(*ppDb, 0, DB_
194c0 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b  SchemaLoaded) ){
194d0 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e  .      SCHEMA_EN
194e0 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a  C(*ppDb) = ENC(*
194f0 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
19500 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
19510 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
19520 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19530 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
19540 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
19550 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  al);..  return r
19560 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64  c & 0xff;.}.#end
19570 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
19580 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
19590 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
195a0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
195b0 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
195c0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
195d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
195e0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
195f0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
19600 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
19610 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
19620 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
19630 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
19640 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
19650 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
19660 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72  st void*).){.  r
19670 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
19680 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
19690 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63  2(db, zName, enc
196a0 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
196b0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
196c0 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
196d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
196e0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
196f0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
19700 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
19710 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
19720 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
19730 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
19740 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
19750 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
19760 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
19770 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
19780 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
19790 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
197a0 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
197b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
197c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
197d0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
197e0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
197f0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
19800 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
19810 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
19820 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
19830 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
19840 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
19850 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
19860 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19870 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
19880 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
19890 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
198a0 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
198b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
198c0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
198d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
198e0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
198f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19910 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
19920 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
19930 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19940 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
19950 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
19960 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
19970 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
19980 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
19990 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
199a0 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
199b0 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
199c0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
199d0 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
199e0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
199f0 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
19a00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19a10 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
19a20 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
19a30 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
19a40 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
19a50 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
19a60 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
19a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
19a80 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
19a90 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
19aa0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
19ab0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
19ac0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19ad0 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
19ae0 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
19af0 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
19b00 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
19b10 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
19b20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
19b30 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
19b40 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c  zName8, (u8)enc,
19b50 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
19b60 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
19b70 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
19b80 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
19b90 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
19ba0 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
19bb0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
19bc0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
19bd0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
19be0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
19bf0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
19c00 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
19c10 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
19c20 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
19c30 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
19c40 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
19c50 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
19c60 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
19c70 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19c80 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
19c90 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
19ca0 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
19cb0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
19cc0 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
19cd0 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
19ce0 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
19cf0 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
19d00 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
19d10 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
19d20 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
19d30 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
19d40 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
19d50 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
19d60 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
19d70 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
19d80 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
19d90 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
19da0 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
19db0 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
19dc0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
19dd0 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
19de0 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
19df0 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
19e00 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
19e10 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
19e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19e30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
19e40 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
19e50 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
19e60 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19e70 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
19e80 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
19e90 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
19ea0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
19eb0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
19ec0 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
19ed0 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
19ee0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
19ef0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
19f00 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
19f10 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
19f20 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
19f30 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
19f40 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
19f50 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
19f60 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23  onst void*).){.#
19f70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19f80 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
19f90 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
19fa0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
19fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
19fc0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
19fd0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
19fe0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
19ff0 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
1a000 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
1a010 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
1a020 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
1a030 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
1a040 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
1a050 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
1a060 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1a070 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1a080 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1a090 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a0a0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
1a0b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a0c0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1a0d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1a0e0 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
1a0f0 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
1a100 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
1a110 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
1a120 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1a130 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
1a140 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
1a150 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
1a160 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
1a170 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
1a180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a190 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
1a1a0 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
1a1b0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1a1c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1a1d0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
1a1e0 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
1a1f0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1a200 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
1a210 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
1a220 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
1a230 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
1a240 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
1a250 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
1a260 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
1a270 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
1a280 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
1a290 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a  or ROLLBACK..*/.
1a2a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
1a2b0 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
1a2c0 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
1a2d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1a2e0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1a2f0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1a300 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1a310 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1a320 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1a330 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
1a340 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  f.  return db->a
1a350 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a  utoCommit;.}../*
1a360 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1a370 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73  g routines are s
1a380 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63  ubstitutes for c
1a390 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f  onstants SQLITE_
1a3a0 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49  CORRUPT,.** SQLI
1a3b0 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54  TE_MISUSE, SQLIT
1a3c0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49  E_CANTOPEN, SQLI
1a3d0 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73  TE_NOMEM and pos
1a3e0 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f  sibly other erro
1a3f0 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20  r.** constants. 
1a400 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20   They serve two 
1a410 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  purposes:.**.** 
1a420 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61    1.  Serve as a
1a430 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
1a440 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
1a450 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67  point in a debug
1a460 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ger.**       to 
1a470 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73  detect when vers
1a480 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ion error condit
1a490 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ions occurs..**.
1a4a0 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20  **   2.  Invoke 
1a4b0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
1a4c0 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75   provide the sou
1a4d0 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f  rce code locatio
1a4e0 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20  n where.**      
1a4f0 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72   a low-level err
1a500 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65  or is first dete
1a510 63 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cted..*/.static 
1a520 69 6e 74 20 72 65 70 6f 72 74 45 72 72 6f 72 28  int reportError(
1a530 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69  int iErr, int li
1a540 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72  neno, const char
1a550 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69   *zType){.  sqli
1a560 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25  te3_log(iErr, "%
1a570 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  s at line %d of 
1a580 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
1a590 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c          zType, l
1a5a0 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
1a5b0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
1a5c0 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a   return iErr;.}.
1a5d0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
1a5e0 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  ptError(int line
1a5f0 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1a600 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a610 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1a620 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45    return reportE
1a630 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52 52  rror(SQLITE_CORR
1a640 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 22 64 61  UPT, lineno, "da
1a650 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1a660 6e 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  n");.}.int sqlit
1a670 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e  e3MisuseError(in
1a680 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1a690 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1a6a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1a6b0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
1a6c0 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1a6d0 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f  E_MISUSE, lineno
1a6e0 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69  , "misuse");.}.i
1a6f0 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70  nt sqlite3Cantop
1a700 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  enError(int line
1a710 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1a720 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a730 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1a740 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45    return reportE
1a750 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1a760 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f 2c 20 22 63  OPEN, lineno, "c
1a770 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 22  annot open file"
1a780 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
1a790 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
1a7a0 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69  ite3NomemError(i
1a7b0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1a7c0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1a7d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1a7e0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1a7f0 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1a800 54 45 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f  TE_NOMEM, lineno
1a810 2c 20 22 4f 4f 4d 22 29 3b 0a 7d 0a 69 6e 74 20  , "OOM");.}.int 
1a820 73 71 6c 69 74 65 33 49 6f 65 72 72 6e 6f 6d 65  sqlite3Ioerrnome
1a830 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  mError(int linen
1a840 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1a850 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1a860 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1a870 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72   return reportEr
1a880 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1a890 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20  _NOMEM, lineno, 
1a8a0 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29  "I/O OOM error")
1a8b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
1a8c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a8d0 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
1a8e0 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65   This is a conve
1a8f0 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74  nience routine t
1a900 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74  hat makes sure t
1a910 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73  hat all thread-s
1a920 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20  pecific.** data 
1a930 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20  for this thread 
1a940 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63  has been dealloc
1a950 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ated..**.** SQLi
1a960 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
1a970 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  s thread-specifi
1a980 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72  c data so this r
1a990 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a  outine is now a.
1a9a0 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73  ** no-op.  It is
1a9b0 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69   retained for hi
1a9c0 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69  storical compati
1a9d0 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  bility..*/.void 
1a9e0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
1a9f0 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a  leanup(void){.}.
1aa00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1aa10 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d  turn meta inform
1aa20 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70  ation about a sp
1aa30 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66  ecific column of
1aa40 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
1aa50 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
1aa60 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28  t in sqlite3.h (
1aa70 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72  sqlite.h.in) for
1aa80 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74   details..*/.int
1aa90 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
1aaa0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
1aab0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aad0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
1aae0 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
1aaf0 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
1ab00 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1ab10 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
1ab20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1ab30 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
1ab40 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
1ab50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1ab60 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
1ab70 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
1ab80 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
1ab90 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
1aba0 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
1abb0 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
1abc0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
1abd0 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
1abe0 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
1abf0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
1ac00 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
1ac10 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1ac20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1ac30 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
1ac40 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
1ac50 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
1ac60 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
1ac70 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1ac80 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
1ac90 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
1aca0 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
1acb0 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1acc0 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
1acd0 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
1ace0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1acf0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
1ad00 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
1ad10 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
1ad20 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
1ad30 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63  nt iCol = 0;.  c
1ad40 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61  har const *zData
1ad50 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
1ad60 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71   const *zCollSeq
1ad70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e   = 0;.  int notn
1ad80 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ull = 0;.  int p
1ad90 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20  rimarykey = 0;. 
1ada0 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30   int autoinc = 0
1adb0 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;...#ifdef SQLIT
1adc0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1add0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1ade0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1adf0 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65  b) || zTableName
1ae00 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1ae10 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1ae20 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
1ae30 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68  ..  /* Ensure th
1ae40 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1ae50 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65  a has been loade
1ae60 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  d */.  sqlite3_m
1ae70 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1ae80 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
1ae90 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
1aea0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1aeb0 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
1aec0 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
1aed0 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
1aee0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1aef0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
1af00 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
1af10 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
1af20 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1af30 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
1af40 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
1af50 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
1af60 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
1af70 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
1af80 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1af90 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
1afa0 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
1afb0 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
1afc0 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a  ested */.  if( z
1afd0 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b  ColumnName==0 ){
1afe0 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f  .    /* Query fo
1aff0 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74  r existance of t
1b000 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d  able only */.  }
1b010 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
1b020 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
1b030 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
1b040 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
1b050 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
1b060 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
1b070 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
1b080 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
1b090 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
1b0a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1b0b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
1b0c0 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
1b0d0 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
1b0e0 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71  owid(pTab) && sq
1b0f0 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
1b100 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
1b110 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62       iCol = pTab
1b120 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
1b130 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20   pCol = iCol>=0 
1b140 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  ? &pTab->aCol[iC
1b150 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  ol] : 0;.      }
1b160 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
1b170 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
1b180 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1b190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b1a0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1b1b0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
1b1c0 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
1b1d0 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
1b1e0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
1b1f0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
1b200 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
1b210 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
1b220 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
1b230 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
1b240 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
1b250 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
1b260 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
1b270 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
1b280 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
1b290 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
1b2a0 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
1b2b0 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
1b2c0 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
1b2d0 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
1b2e0 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
1b2f0 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
1b300 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
1b310 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
1b320 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
1b330 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
1b340 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
1b350 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
1b360 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
1b370 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
1b380 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
1b390 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
1b3a0 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
1b3b0 20 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c   zDataType = sql
1b3c0 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
1b3d0 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c  Col,0);.    zCol
1b3e0 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f  lSeq = pCol->zCo
1b3f0 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20  ll;.    notnull 
1b400 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21  = pCol->notNull!
1b410 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  =0;.    primaryk
1b420 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c  ey  = (pCol->col
1b430 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
1b440 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20  PRIMKEY)!=0;.   
1b450 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d   autoinc = pTab-
1b460 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20  >iPKey==iCol && 
1b470 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1b480 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
1b490 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  nt)!=0;.  }else{
1b4a0 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
1b4b0 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
1b4c0 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a  primarykey = 1;.
1b4d0 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c    }.  if( !zColl
1b4e0 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c  Seq ){.    zColl
1b4f0 53 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Seq = sqlite3Str
1b500 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72  BINARY;.  }..err
1b510 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
1b520 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
1b530 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65  b);..  /* Whethe
1b540 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  r the function c
1b550 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72  all succeeded or
1b560 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65   failed, set the
1b570 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
1b580 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65  rs.  ** to whate
1b590 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20  ver their local 
1b5a0 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e  counterparts con
1b5b0 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tain. If an erro
1b5c0 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a  r did occur,.  *
1b5d0 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65  * this has the e
1b5e0 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67  ffect of zeroing
1b5f0 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61   all output para
1b600 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  meters..  */.  i
1b610 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20  f( pzDataType ) 
1b620 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44  *pzDataType = zD
1b630 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70  ataType;.  if( p
1b640 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f  zCollSeq ) *pzCo
1b650 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71  llSeq = zCollSeq
1b660 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c  ;.  if( pNotNull
1b670 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e   ) *pNotNull = n
1b680 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50  otnull;.  if( pP
1b690 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72  rimaryKey ) *pPr
1b6a0 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61  imaryKey = prima
1b6b0 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75  rykey;.  if( pAu
1b6c0 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e  toinc ) *pAutoin
1b6d0 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20  c = autoinc;..  
1b6e0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
1b6f0 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  c && !pTab ){.  
1b700 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b710 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1b720 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
1b730 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1b740 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f  no such table co
1b750 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54  lumn: %s.%s", zT
1b760 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  ableName,.      
1b770 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a    zColumnName);.
1b780 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b790 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
1b7a0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
1b7b0 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73  (db, rc, (zErrMs
1b7c0 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d  g?"%s":0), zErrM
1b7d0 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
1b7e0 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
1b7f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b800 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
1b810 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1b820 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1b830 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1b840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
1b850 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
1b860 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
1b870 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
1b880 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
1b890 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d  ite3_sleep(int m
1b8a0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
1b8b0 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  s *pVfs;.  int r
1b8c0 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69  c;.  pVfs = sqli
1b8d0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
1b8e0 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29  .  if( pVfs==0 )
1b8f0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
1b900 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1b910 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63  orks in millisec
1b920 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e  onds, but the un
1b930 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70  derlying OsSleep
1b940 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65  () .  ** API use
1b950 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  s microseconds. 
1b960 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73  Hence the 1000's
1b970 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73  ..  */.  rc = (s
1b980 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56  qlite3OsSleep(pV
1b990 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30  fs, 1000*ms)/100
1b9a0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
1b9b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
1b9c0 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
1b9d0 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
1b9e0 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  codes..*/.int sq
1b9f0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
1ba00 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69  esult_codes(sqli
1ba10 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f  te3 *db, int ono
1ba20 66 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ff){.#ifdef SQLI
1ba30 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1ba40 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1ba50 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1ba60 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1ba70 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1ba80 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1ba90 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1baa0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1bab0 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20  errMask = onoff 
1bac0 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
1bad0 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  xff;.  sqlite3_m
1bae0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1baf0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1bb00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1bb10 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78  .** Invoke the x
1bb20 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68  FileControl meth
1bb30 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  od on a particul
1bb40 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ar database..*/.
1bb50 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  int sqlite3_file
1bb60 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  _control(sqlite3
1bb70 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1bb80 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f   *zDbName, int o
1bb90 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1bba0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bbb0 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65  E_ERROR;.  Btree
1bbc0 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65   *pBtree;..#ifde
1bbd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1bbe0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1bbf0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1bc00 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1bc10 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1bc20 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1bc30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1bc40 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1bc50 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74    pBtree = sqlit
1bc60 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1bc70 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
1bc80 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1bc90 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1bca0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
1bcb0 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74  e *fd;.    sqlit
1bcc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1bcd0 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ree);.    pPager
1bce0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1bcf0 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  ager(pBtree);.  
1bd00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bd10 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20  !=0 );.    fd = 
1bd20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1bd30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
1bd40 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20  sert( fd!=0 );. 
1bd50 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54     if( op==SQLIT
1bd60 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
1bd70 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28  NTER ){.      *(
1bd80 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70  sqlite3_file**)p
1bd90 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  Arg = fd;.      
1bda0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bdb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1bdc0 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  ==SQLITE_FCNTL_V
1bdd0 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  FS_POINTER ){.  
1bde0 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66      *(sqlite3_vf
1bdf0 73 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  s**)pArg = sqlit
1be00 65 33 50 61 67 65 72 56 66 73 28 70 50 61 67 65  e3PagerVfs(pPage
1be10 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1be20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1be30 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  lse if( op==SQLI
1be40 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c  TE_FCNTL_JOURNAL
1be50 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1be60 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
1be70 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1be80 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70  3PagerJrnlFile(p
1be90 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1bea0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1beb0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e    }else if( fd->
1bec0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1bed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1bee0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
1bef0 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  op, pArg);.    }
1bf00 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1bf10 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
1bf20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1bf30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1bf40 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tree);.  }.  sql
1bf50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1bf60 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1bf70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bf80 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
1bf90 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
1bfa0 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
1bfb0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
1bfc0 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
1bfd0 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65  nt rc = 0;.#ifde
1bfe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  f SQLITE_OMIT_BU
1bff0 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 55 4e 55  ILTIN_TEST.  UNU
1c000 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70  SED_PARAMETER(op
1c010 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69  );.#else.  va_li
1c020 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
1c030 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
1c040 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
1c050 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74  /*.    ** Save t
1c060 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1c070 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20   of the PRNG..  
1c080 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c090 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1c0a0 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20  NG_SAVE: {.     
1c0b0 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65   sqlite3PrngSave
1c0c0 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
1c0d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c0e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f   /*.    ** Resto
1c0f0 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  re the state of 
1c100 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20  the PRNG to the 
1c110 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64  last state saved
1c120 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52   using.    ** PR
1c130 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e  NG_SAVE.  If PRN
1c140 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72  G_SAVE has never
1c150 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c   before been cal
1c160 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
1c170 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20   this verb acts 
1c180 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e  like PRNG_RESET.
1c190 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c1a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1c1b0 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b  _PRNG_RESTORE: {
1c1c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
1c1d0 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29  ngRestoreState()
1c1e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c1f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1c200 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52   ** Reset the PR
1c210 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75  NG back to its u
1c220 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61  ninitialized sta
1c230 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61  te.  The next ca
1c240 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
1c250 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1c260 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68  ) will reseed th
1c270 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73  e PRNG using a s
1c280 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a  ingle call.    *
1c290 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d  * to the xRandom
1c2a0 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74  ness method of t
1c2b0 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a  he default VFS..
1c2c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c2d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c2e0 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20  PRNG_RESET: {.  
1c2f0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
1c300 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20  omness(0,0);.   
1c310 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c320 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1c330 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1c340 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54  trol(BITVEC_TEST
1c350 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29  , size, program)
1c360 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1c370 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73  un a test agains
1c380 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63  t a Bitvec objec
1c390 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20  t of size.  The 
1c3a0 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74  program argument
1c3b0 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72  .    ** is an ar
1c3c0 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
1c3d0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1c3e0 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d   test.  Return -
1c3f0 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65  1 on a.    ** me
1c400 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1c410 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63  error, 0 on succ
1c420 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  ess, or non-zero
1c430 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
1c440 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71     ** See the sq
1c450 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
1c460 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64  inTest() for add
1c470 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1c480 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1c490 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1c4a0 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
1c4b0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  : {.      int sz
1c4c0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1c4d0 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  t);.      int *a
1c4e0 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  Prog = va_arg(ap
1c4f0 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72  , int*);.      r
1c500 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
1c510 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c  cBuiltinTest(sz,
1c520 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62   aProg);.      b
1c530 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c540 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1c550 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1c560 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20  (FAULT_INSTALL, 
1c570 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a  xCallback).    *
1c580 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65  *.    ** Arrange
1c590 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c   to invoke xCall
1c5a0 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20  back() whenever 
1c5b0 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1c5c0 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20  ) is called,.   
1c5d0 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b   ** if xCallback
1c5e0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
1c5f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61    **.    ** As a
1c600 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61 75   test of the fau
1c610 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63  lt simulator mec
1c620 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73  hanism itself, s
1c630 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1c640 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c  ).    ** is call
1c650 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
1c660 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20  fter installing 
1c670 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b  the new callback
1c680 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a   and the return.
1c690 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f      ** value fro
1c6a0 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  m sqlite3FaultSi
1c6b0 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65  m(0) becomes the
1c6c0 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20   return from.   
1c6d0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   ** sqlite3_test
1c6e0 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20  _control()..    
1c6f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1c700 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c  TE_TESTCTRL_FAUL
1c710 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20  T_INSTALL: {.   
1c720 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69     /* MSVC is pi
1c730 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e  cky about pullin
1c740 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d  g func ptrs from
1c750 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20   va lists..     
1c760 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f   ** http://suppo
1c770 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d  rt.microsoft.com
1c780 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20  /kb/47961.      
1c790 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
1c7a0 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c  Config.xTestCall
1c7b0 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70  back = va_arg(ap
1c7c0 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a  , int(*)(int));.
1c7d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
1c7e0 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54  ypedef int(*TEST
1c7f0 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28  CALLBACKFUNC_t)(
1c800 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
1c810 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c820 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20  xTestCallback = 
1c830 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43  va_arg(ap, TESTC
1c840 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a  ALLBACKFUNC_t);.
1c850 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c860 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20  e3FaultSim(0);. 
1c870 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c880 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1c890 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1c8a0 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41  ontrol(BENIGN_MA
1c8b0 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67  LLOC_HOOKS, xBeg
1c8c0 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a  in, xEnd).    **
1c8d0 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72  .    ** Register
1c8e0 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74   hooks to call t
1c8f0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  o indicate which
1c900 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1c910 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62  es .    ** are b
1c920 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  enign..    */.  
1c930 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1c940 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
1c950 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20  LLOC_HOOKS: {.  
1c960 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
1c970 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e   (*void_function
1c980 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76  )(void);.      v
1c990 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
1c9a0 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20  nignBegin;.     
1c9b0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
1c9c0 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20  BenignEnd;.     
1c9d0 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20   xBenignBegin = 
1c9e0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
1c9f0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
1ca00 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61   xBenignEnd = va
1ca10 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
1ca20 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  nction);.      s
1ca30 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c  qlite3BenignMall
1ca40 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42  ocHooks(xBenignB
1ca50 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64  egin, xBenignEnd
1ca60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ca70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1ca80 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1ca90 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1caa0 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
1cab0 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65  NG_BYTE, unsigne
1cac0 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  d int X).    **.
1cad0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50      ** Set the P
1cae0 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74  ENDING byte to t
1caf0 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
1cb00 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30  argument, if X>0
1cb10 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f  ..    ** Make no
1cb20 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30   changes if X==0
1cb30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  .  Return the va
1cb40 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69  lue of the pendi
1cb50 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61  ng byte.    ** a
1cb60 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65  s it existing be
1cb70 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1cb80 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  e was called..  
1cb90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f    **.    ** IMPO
1cba0 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67  RTANT:  Changing
1cbb0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1cbc0 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30  e from 0x4000000
1cbd0 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20  0 results in.   
1cbe0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   ** an incompati
1cbf0 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ble database fil
1cc00 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67  e format.  Chang
1cc10 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
1cc20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  byte.    ** whil
1cc30 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63  e any database c
1cc40 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
1cc50 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64  n results in und
1cc60 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a  efined and.    *
1cc70 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65  * deleterious be
1cc80 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  havior..    */. 
1cc90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1cca0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1ccb0 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63  BYTE: {.      rc
1ccc0 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
1ccd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cce0 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b  OMIT_WSD.      {
1ccf0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1cd00 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76  d int newVal = v
1cd10 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
1cd20 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ed int);.       
1cd30 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71   if( newVal ) sq
1cd40 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65  lite3PendingByte
1cd50 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20   = newVal;.     
1cd60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1cd70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1cd80 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1cd90 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1cda0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1cdb0 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29  L_ASSERT, int X)
1cdc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1cdd0 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
1cde0 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
1cdf0 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
1ce00 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a  er or not.    **
1ce10 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e   assert() was en
1ce20 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
1ce30 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20  -time.  If X is 
1ce40 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28  true and assert(
1ce50 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62  ).    ** is enab
1ce60 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
1ce70 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72  turn value is tr
1ce80 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  ue.  If X is tru
1ce90 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73  e and.    ** ass
1cea0 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1ceb0 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
1cec0 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
1ced0 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a  .  If X is.    *
1cee0 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  * false and asse
1cef0 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c  rt() is enabled,
1cf00 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74   then the assert
1cf10 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68  ion fires and th
1cf20 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
1cf30 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69   aborts.  If X i
1cf40 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  s false and asse
1cf50 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1cf60 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
1cf70 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1cf80 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  s zero..    */. 
1cf90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1cfa0 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20  ESTCTRL_ASSERT: 
1cfb0 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65  {.      volatile
1cfc0 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20   int x = 0;.    
1cfd0 20 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64 65    assert( /*side
1cfe0 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78  -effects-ok*/ (x
1cff0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1d000 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
1d010 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65  c = x;.      bre
1d020 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1d030 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1d040 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1d050 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d060 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20  ALWAYS, int X). 
1d070 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1d080 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
1d090 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
1d0a0 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65  t to see how the
1d0b0 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20   ALWAYS and.    
1d0c0 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20  ** NEVER macros 
1d0d0 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20  were defined at 
1d0e0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20  compile-time..  
1d0f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1d100 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1d110 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20  ALWAYS(X).  .   
1d120 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1d130 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20  ecommended test 
1d140 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65  is X==2.  If the
1d150 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1d160 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20   2, that means. 
1d170 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61     ** ALWAYS() a
1d180 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62  nd NEVER() are b
1d190 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  oth no-op pass-t
1d1a0 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77  hrough macros, w
1d1b0 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20  hich is the.    
1d1c0 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  ** default setti
1d1d0 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  ng.  If the retu
1d1e0 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74  rn value is 1, t
1d1f0 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20  hen ALWAYS() is 
1d200 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61  either.    ** ha
1d210 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
1d220 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65   or else it asse
1d230 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d  rts if its argum
1d240 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  ent is false..  
1d250 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62    ** The first b
1d260 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f  ehavior (hard-co
1d270 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20  ded to true) is 
1d280 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
1d290 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
1d2a0 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
1d2b0 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
1d2c0 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68   disabled and th
1d2d0 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
1d2e0 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74  behavior (assert
1d2f0 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
1d300 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20   to ALWAYS() is 
1d310 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61  false) is the ca
1d320 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
1d330 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1d340 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
1d350 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
1d360 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1d370 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74  * The run-time t
1d380 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69  est procedure mi
1d390 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69  ght look somethi
1d3a0 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ng like this:.  
1d3b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69    **.    **    i
1d3c0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
1d3d0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d3e0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
1d3f0 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20  2)==2 ){.    ** 
1d400 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29       // ALWAYS()
1d410 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
1d420 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1d430 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a  ugh macros.    *
1d440 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  *    }else if( s
1d450 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d460 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d470 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29  TRL_ASSERT, 1) )
1d480 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1d490 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72   ALWAYS(x) asser
1d4a0 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75  ts that x is tru
1d4b0 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65  e. NEVER(x) asse
1d4c0 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a  rts x is false..
1d4d0 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b      **    }else{
1d4e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1d4f0 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63  ALWAYS(x) is a c
1d500 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45  onstant 1.  NEVE
1d510 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61  R(x) is a consta
1d520 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20  nt 0..    **    
1d530 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  }.    */.    cas
1d540 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d550 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20  L_ALWAYS: {.    
1d560 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
1d570 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1d580 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a  rc = ALWAYS(x);.
1d590 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d5a0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1d5b0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1d5c0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d5d0 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44  TESTCTRL_BYTEORD
1d5e0 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ER);.    **.    
1d5f0 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 72  ** The integer r
1d600 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c 73 20  eturned reveals 
1d610 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f  the byte-order o
1d620 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20 6f  f the computer o
1d630 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 53  n which.    ** S
1d640 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69 6e 67  QLite is running
1d650 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1d660 20 20 20 20 20 20 31 20 20 20 20 20 62 69 67 2d        1     big-
1d670 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72  endian,    deter
1d680 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  mined at run-tim
1d690 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 31 30  e.    **      10
1d6a0 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69       little-endi
1d6b0 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61  an, determined a
1d6c0 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
1d6d0 2a 20 20 34 33 32 31 30 31 20 20 20 20 20 62 69  *  432101     bi
1d6e0 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74  g-endian,    det
1d6f0 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  ermined at compi
1d700 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  le-time.    **  
1d710 31 32 33 34 31 30 20 20 20 20 20 6c 69 74 74 6c  123410     littl
1d720 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
1d730 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1d740 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20  time.    */ .   
1d750 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1d760 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a  TCTRL_BYTEORDER:
1d770 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
1d780 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 2a 31  LITE_BYTEORDER*1
1d790 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54  00 + SQLITE_LITT
1d7a0 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51  LEENDIAN*10 + SQ
1d7b0 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a  LITE_BIGENDIAN;.
1d7c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d7d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1d7e0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1d7f0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1d800 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74  L_RESERVE, sqlit
1d810 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
1d820 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1d830 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 69   the nReserve si
1d840 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20  ze to N for the 
1d850 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
1d860 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1d870 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
1d880 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  db..    */.    c
1d890 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1d8a0 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20  TRL_RESERVE: {. 
1d8b0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1d8c0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
1d8d0 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69  lite3*);.      i
1d8e0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1d8f0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,int);.      sql
1d900 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1d910 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1d920 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
1d930 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61  etPageSize(db->a
1d940 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c  Db[0].pBt, 0, x,
1d950 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1d960 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1d970 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1d980 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1d990 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
1d9a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1d9b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
1d9c0 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74  MIZATIONS, sqlit
1d9d0 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
1d9e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61     **.    ** Ena
1d9f0 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76  ble or disable v
1da00 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1da10 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67  ions for testing
1da20 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20   purposes.  The 
1da30 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  .    ** argument
1da40 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20   N is a bitmask 
1da50 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  of optimizations
1da60 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e   to be disabled.
1da70 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20    For normal.   
1da80 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20   ** operation N 
1da90 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68  should be 0.  Th
1daa0 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 61  e idea is that a
1dab0 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c   test program (l
1dac0 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  ike the.    ** S
1dad0 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72  QL Logic Test or
1dae0 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65   SLT test module
1daf0 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61  ) can run the sa
1db00 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20  me SQL multiple 
1db10 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74  times.    ** wit
1db20 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  h various optimi
1db30 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64  zations disabled
1db40 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1db50 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
1db60 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e      ** is obtain
1db70 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73 65  ed in every case
1db80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1db90 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1dba0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a  L_OPTIMIZATIONS:
1dbb0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1dbc0 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1dbd0 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1dbe0 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67     db->dbOptFlag
1dbf0 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72 67  s = (u16)(va_arg
1dc00 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66 66  (ap, int) & 0xff
1dc10 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ff);.      break
1dc20 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
1dc30 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
1dc40 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1dc50 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1dc60 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
1dc70 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68  EYWORD, const ch
1dc80 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a  ar *zWord).    *
1dc90 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72  *.    ** If zWor
1dca0 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72  d is a keyword r
1dcb0 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65  ecognized by the
1dcc0 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65   parser, then re
1dcd0 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  turn the.    ** 
1dce0 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72  number of keywor
1dcf0 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64  ds.  Or if zWord
1dd00 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72   is not a keywor
1dd10 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20  d, return 0..   
1dd20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73   ** .    ** This
1dd30 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69 73   test feature is
1dd40 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1dd50 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  in the amalgamat
1dd60 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a  ion since.    **
1dd70 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45   the SQLITE_N_KE
1dd80 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e  YWORD macro is n
1dd90 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ot defined in th
1dda0 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74  is file if SQLit
1ddb0 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c  e.    ** is buil
1ddc0 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  t using separate
1ddd0 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20   source files.. 
1dde0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1ddf0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1de00 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20  SKEYWORD: {.    
1de10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
1de20 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ord = va_arg(ap,
1de30 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20   const char*);. 
1de40 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
1de50 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f  ite3Strlen30(zWo
1de60 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rd);.      rc = 
1de70 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43  (sqlite3KeywordC
1de80 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20  ode((u8*)zWord, 
1de90 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c  n)!=TK_ID) ? SQL
1dea0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20  ITE_N_KEYWORD : 
1deb0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1dec0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20      }.#endif .. 
1ded0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
1dee0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1def0 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
1df00 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70  CHMALLOC, sz, &p
1df10 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  New, pFree);.   
1df20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20   **.    ** Pass 
1df30 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74  pFree into sqlit
1df40 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29 2e  e3ScratchFree().
1df50 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30   .    ** If sz>0
1df60 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
1df70 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20   scratch buffer 
1df80 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20  into pNew.  .   
1df90 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1dfa0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
1dfb0 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  ATCHMALLOC: {.  
1dfc0 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c      void *pFree,
1dfd0 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20   **ppNew;.      
1dfe0 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a  int sz;.      sz
1dff0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1e000 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20  t);.      ppNew 
1e010 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1e020 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65  d**);.      pFre
1e030 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
1e040 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28  oid*);.      if(
1e050 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73   sz ) *ppNew = s
1e060 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
1e070 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73  loc(sz);.      s
1e080 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
1e090 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
1e0a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e0b0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1e0c0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1e0d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
1e0e0 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74  LTIME_FAULT, int
1e0f0 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
1e100 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
1e110 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
1e120 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65  -zero, configure
1e130 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73 6f   the wrappers so
1e140 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a   that all.    **
1e150 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
1e160 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29  s to localtime()
1e170 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61   and variants fa
1e180 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
1e190 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64  zero,.    ** und
1e1a0 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a  o this setting..
1e1b0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e1c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e1d0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
1e1e0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e1f0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f  GlobalConfig.bLo
1e200 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76  caltimeFault = v
1e210 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1e220 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e230 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1e240 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e250 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e260 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
1e270 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   int);.    **.  
1e280 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61    ** Set or clea
1e290 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  r a flag that in
1e2a0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1e2b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1e2c0 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20  s always well-. 
1e2d0 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64     ** formed and
1e2e0 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20   never corrupt. 
1e2f0 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c   This flag is cl
1e300 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20  ear by default, 
1e310 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a  indicating that.
1e320 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1e330 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65  files might have
1e340 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75   arbitrary corru
1e350 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20  ption.  Setting 
1e360 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a  the flag during.
1e370 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63      ** testing c
1e380 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73  auses certain as
1e390 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1e3a0 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f  s in the code to
1e3b0 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20   be activated.  
1e3c0 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73    ** that demons
1e3d0 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20  trat invariants 
1e3e0 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  on well-formed d
1e3f0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20  atabase files.. 
1e400 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e410 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1e420 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a  EVER_CORRUPT: {.
1e430 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1e440 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43  balConfig.neverC
1e450 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28  orrupt = va_arg(
1e460 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1e470 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
1e480 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1e490 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1e4a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42  ITE_TESTCTRL_VDB
1e4b0 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c  E_COVERAGE, xCal
1e4c0 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20  lback, ptr);.   
1e4d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1e4e0 68 65 20 56 44 42 45 20 63 6f 76 65 72 61 67 65  he VDBE coverage
1e4f0 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
1e500 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20  on to xCallback 
1e510 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20  with context .  
1e520 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72    ** pointer ptr
1e530 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e540 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e550 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a  L_VDBE_COVERAGE:
1e560 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
1e570 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
1e580 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1e590 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62  d (*branch_callb
1e5a0 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75  ack)(void*,int,u
1e5b0 38 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  8,u8);.      sql
1e5c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1e5d0 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76  .xVdbeBranch = v
1e5e0 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f  a_arg(ap,branch_
1e5f0 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  callback);.     
1e600 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1e610 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68  nfig.pVdbeBranch
1e620 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Arg = va_arg(ap,
1e630 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20  void*);.#endif. 
1e640 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e650 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1e660 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e670 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e680 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62  _SORTER_MMAP, db
1e690 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20  , nMax); */.    
1e6a0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e6b0 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
1e6c0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1e6d0 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1e6e0 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1e6f0 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74      db->nMaxSort
1e700 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  erMmap = va_arg(
1e710 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1e720 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e730 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1e740 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1e750 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
1e760 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  IT);.    **.    
1e770 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1e780 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61  _OK if SQLite ha
1e790 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
1e7a0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52  ed and SQLITE_ER
1e7b0 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f  ROR if.    ** no
1e7c0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
1e7d0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1e7e0 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20  RL_ISINIT: {.   
1e7f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
1e800 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
1e810 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  t==0 ) rc = SQLI
1e820 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1e830 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e840 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    /*  sqlite3_te
1e850 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1e860 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
1e870 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c  TER, db, dbName,
1e880 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20   onOff, tnum);. 
1e890 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1e8a0 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69  s test control i
1e8b0 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
1e8c0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
1e8d0 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f 69  .  "db" is a poi
1e8e0 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74  nter.    ** to t
1e8f0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1e900 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20  ection.  dbName 
1e910 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1e920 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  name (ex: "main"
1e930 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70   or.    ** "temp
1e940 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65  ") which will re
1e950 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73 74  ceive the impost
1e960 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75 72  er.  "onOff" tur
1e970 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  ns imposter mode
1e980 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66   on.    ** or of
1e990 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74 68  f.  "tnum" is th
1e9a0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1e9b0 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68 69  he b-tree to whi
1e9c0 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72 0a  ch the imposter.
1e9d0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f      ** table sho
1e9e0 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20  uld connect..   
1e9f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
1ea00 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20  e imposter mode 
1ea10 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73 63  only when the sc
1ea20 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64 79  hema has already
1ea30 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20 54   been parsed.  T
1ea40 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61  hen.    ** run a
1ea50 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20 54   single CREATE T
1ea60 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74  ABLE statement t
1ea70 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
1ea80 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69  imposter table i
1ea90 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72  n.    ** the par
1eaa0 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68 65  sed schema.  The
1eab0 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72 20  n turn imposter 
1eac0 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61 67  mode back off ag
1ead0 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ain..    **.    
1eae0 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61  ** If onOff==0 a
1eaf0 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72  nd tnum>0 then r
1eb00 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
1eb10 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
1eb20 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a  s, causing.    *
1eb30 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
1eb40 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65 20  be reparsed the 
1eb50 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
1eb60 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68 61  needed.  This ha
1eb70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66 66  s the.    ** eff
1eb80 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20 61  ect of erasing a
1eb90 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  ll imposter tabl
1eba0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1ebb0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1ebc0 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a  TRL_IMPOSTER: {.
1ebd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1ebe0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1ebf0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1ec00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1ec10 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1ec20 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69        db->init.i
1ec30 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
1ec40 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61 72  DbName(db, va_ar
1ec50 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  g(ap,const char*
1ec60 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  ));.      db->in
1ec70 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  it.busy = db->in
1ec80 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
1ec90 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1eca0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69  );.      db->ini
1ecb0 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61  t.newTnum = va_a
1ecc0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1ecd0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1ece0 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e  usy==0 && db->in
1ecf0 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a  it.newTnum>0 ){.
1ed00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
1ed10 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
1ed20 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
1ed30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1ed40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1ed50 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1ed60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ed70 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
1ed80 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1ed90 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
1eda0 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
1edb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1edc0 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
1edd0 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
1ede0 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
1edf0 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
1ee00 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
1ee10 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
1ee20 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
1ee30 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
1ee40 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
1ee50 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
1ee60 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
1ee70 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
1ee80 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1ee90 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
1eea0 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
1eeb0 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
1eec0 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
1eed0 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
1eee0 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
1eef0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
1ef00 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
1ef10 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
1ef20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
1ef30 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
1ef40 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
1ef50 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1ef60 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
1ef70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
1ef80 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
1ef90 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
1efa0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
1efb0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1efc0 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
1efd0 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
1efe0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
1eff0 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
1f000 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1f010 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1f020 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
1f030 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61  lename==0 || zPa
1f040 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ram==0 ) return 
1f050 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  0;.  zFilename +
1f060 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1f070 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1f080 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65  ;.  while( zFile
1f090 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
1f0a0 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46  nt x = strcmp(zF
1f0b0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
1f0c0 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
1f0d0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
1f0e0 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
1f0f0 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20  1;.    if( x==0 
1f100 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61  ) return zFilena
1f110 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  me;.    zFilenam
1f120 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
1f130 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
1f140 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  + 1;.  }.  retur
1f150 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
1f160 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76  turn a boolean v
1f170 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79  alue for a query
1f180 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69   parameter..*/.i
1f190 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  nt sqlite3_uri_b
1f1a0 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61  oolean(const cha
1f1b0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1f1c0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1f1d0 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20  , int bDflt){.  
1f1e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1f1f0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1f200 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
1f210 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c   zParam);.  bDfl
1f220 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20  t = bDflt!=0;.  
1f230 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74  return z ? sqlit
1f240 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20  e3GetBoolean(z, 
1f250 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a  bDflt) : bDflt;.
1f260 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f270 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
1f280 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
1f290 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
1f2a0 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1f2b0 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34  qlite3_uri_int64
1f2c0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1f2d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a  zFilename,    /*
1f2e0 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73   Filename as pas
1f2f0 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a  sed to xOpen */.
1f300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1f310 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55  aram,       /* U
1f320 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75  RI parameter sou
1f330 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ght */.  sqlite3
1f340 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20  _int64 bDflt    
1f350 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20     /* return if 
1f360 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73  parameter is mis
1f370 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  sing */.){.  con
1f380 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1f390 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1f3a0 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
1f3b0 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  aram);.  sqlite3
1f3c0 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20  _int64 v;.  if( 
1f3d0 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f  z && sqlite3DecO
1f3e0 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29  rHexToI64(z, &v)
1f3f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f400 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20     bDflt = v;.  
1f410 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74  }.  return bDflt
1f420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1f430 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e  n the Btree poin
1f440 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
1f450 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75  y zDbName.  Retu
1f460 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1f470 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a  ound..*/.Btree *
1f480 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1f490 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  tree(sqlite3 *db
1f4a0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1f4b0 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  bName){.  int i;
1f4c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1f4d0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1f4e0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
1f4f0 70 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62  pBt.     && (zDb
1f500 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
1f510 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d  e3StrICmp(zDbNam
1f520 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  e, db->aDb[i].zN
1f530 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a  ame)==0).    ){.
1f540 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d        return db-
1f550 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
1f560 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f570 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1f580 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
1f590 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f5a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f5b0 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1f5c0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
1f5d0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1f5e0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
1f5f0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1f600 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1f610 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
1f620 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f630 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1f640 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1f650 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1f660 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1f670 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1f680 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1f690 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73  #endif.  pBt = s
1f6a0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1f6b0 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1f6c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
1f6d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1f6e0 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
1f6f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1f700 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
1f710 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
1f720 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
1f730 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
1f740 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
1f750 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
1f760 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
1f770 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
1f780 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1f790 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
1f7a0 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
1f7b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1f7c0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1f7d0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1f7e0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1f7f0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1f800 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1f810 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
1f820 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
1f830 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1f840 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
1f850 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
1f860 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
1f870 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a  ly(pBt) : -1;.}.
1f880 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f890 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f  NABLE_SNAPSHOT./
1f8a0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 6e  *.** Obtain a sn
1f8b0 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 66 6f  apshot handle fo
1f8c0 72 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f  r the snapshot o
1f8d0 66 20 64 61 74 61 62 61 73 65 20 7a 44 62 20 63  f database zDb c
1f8e0 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65 69  urrently .** bei
1f8f0 6e 67 20 72 65 61 64 20 62 79 20 68 61 6e 64 6c  ng read by handl
1f900 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
1f910 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
1f920 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
1f930 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1f940 2a 7a 44 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f  *zDb,.  sqlite3_
1f950 73 6e 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e 61  snapshot **ppSna
1f960 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72  pshot.){.  int r
1f970 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1f980 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1f990 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 6e 74 20  _OMIT_WAL.  int 
1f9a0 69 44 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  iDb;..#ifdef SQL
1f9b0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1f9c0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1f9d0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1f9e0 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
1f9f0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1fa00 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
1fa10 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1fa20 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1fa30 78 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c  x);..  iDb = sql
1fa40 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
1fa50 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69  b, zDb);.  if( i
1fa60 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29  Db==0 || iDb>1 )
1fa70 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
1fa80 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1fa90 70 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  pBt;.    if( 0==
1faa0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
1fab0 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
1fac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fad0 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
1fae0 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  pBt, 0);.      i
1faf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fb00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1fb10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61   sqlite3PagerSna
1fb20 70 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65 33  pshotGet(sqlite3
1fb30 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c  BtreePager(pBt),
1fb40 20 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20   ppSnapshot);.  
1fb50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1fb60 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1fb70 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1fb80 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
1fb90 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
1fba0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1fbb0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72  ../*.** Open a r
1fbc0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fbd0 6f 6e 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  on the snapshot 
1fbe0 69 64 65 6e 64 69 66 69 65 64 20 62 79 20 70 53  idendified by pS
1fbf0 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20  napshot..*/.int 
1fc00 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
1fc10 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  _open(.  sqlite3
1fc20 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63   *db, .  const c
1fc30 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73 71 6c  har *zDb, .  sql
1fc40 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
1fc50 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e  Snapshot.){.  in
1fc60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
1fc70 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ROR;.#ifndef SQL
1fc80 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69  ITE_OMIT_WAL..#i
1fc90 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1fca0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1fcb0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1fcc0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1fcd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1fce0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1fcf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
1fd00 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1fd10 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
1fd20 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
1fd30 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
1fd40 44 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  Db;.    iDb = sq
1fd50 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
1fd60 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  db, zDb);.    if
1fd70 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e  ( iDb==0 || iDb>
1fd80 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  1 ){.      Btree
1fd90 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
1fda0 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
1fdb0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74  if( 0==sqlite3Bt
1fdc0 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73  reeIsInReadTrans
1fdd0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
1fde0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fdf0 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73  erSnapshotOpen(s
1fe00 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1fe10 28 70 42 74 29 2c 20 70 53 6e 61 70 73 68 6f 74  (pBt), pSnapshot
1fe20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1fe30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fe40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1fe50 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1fe60 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20  Trans(pBt, 0);. 
1fe70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fe80 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65  PagerSnapshotOpe
1fe90 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  n(sqlite3BtreePa
1fea0 67 65 72 28 70 42 74 29 2c 20 30 29 3b 0a 20 20  ger(pBt), 0);.  
1feb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1fec0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
1fed0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1fee0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e  (db->mutex);.#en
1fef0 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  dif   /* SQLITE_
1ff00 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65  OMIT_WAL */.  re
1ff10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ff20 2a 20 46 72 65 65 20 61 20 73 6e 61 70 73 68 6f  * Free a snapsho
1ff30 74 20 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e 65  t handle obtaine
1ff40 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73  d from sqlite3_s
1ff50 6e 61 70 73 68 6f 74 5f 67 65 74 28 29 2e 0a 2a  napshot_get()..*
1ff60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73  /.void sqlite3_s
1ff70 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 73 71 6c  napshot_free(sql
1ff80 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
1ff90 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73 71 6c  Snapshot){.  sql
1ffa0 69 74 65 33 5f 66 72 65 65 28 70 53 6e 61 70 73  ite3_free(pSnaps
1ffb0 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  hot);.}.#endif /
1ffc0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1ffd0 53 4e 41 50 53 48 4f 54 20 2a 2f 0a              SNAPSHOT */.